Python子进程Grep
我正在尝试使用subprocess模块在python脚本中使用grep命令。
这是我所拥有的:
userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)
它什么也不返回。我不完全确定自己在做什么错,所以有人可以解释一下。我正在使用的当前方法有效,方法是添加shell =
true,使其输出正确的输出,但是正如帮助页面所指出的那样,这是不安全的。我需要帮助以使此工作正常进行,以便我的脚本不是不安全的。
-
我认为您遇到了两个问题:
- 这个电话:
p = subprocess.Popen(['grep', "%s *.log"%userid]...
除非
shell=True
将参数列表直接传递给os.execvp
,否则它将无法按预期工作,这要求每个项目都是代表参数的单个字符串。您已经将
两个单独的参数 压缩到一个字符串中(换句话说,grep将“foo12 *.log
”解释为要搜索的 模式 ,而不是模式+文件列表)。您可以通过以下方式解决此问题:
p = subprocess.Popen(['grep', userid, '*.log']...)
- 第二个问题是,再次没有
shell=True
,execvp
您*.log
将不知道您的意思并将其直接传递给grep,而无需通过外壳的通配符扩展机制。如果您不想使用shell=True
,则可以执行以下操作:import glob
args = [‘grep’, userid]
args.extend(glob.glob(‘*.log’)
p = subprocess.Popen(args, …)
- 这个电话: