Python Subprocess Grep(Python 子进程 Grep)
问题描述
我正在尝试使用 subprocess 模块在 python 脚本中使用 grep 命令.
I am trying to use the grep command in a python script using the subprocess module.
这是我所拥有的:
userid = 'foo12'
p = subprocess.Popen(['grep', "%s *.log"%userid], stdout=subprocess.PIPE)
它什么都不返回.我不完全确定我做错了什么,所以有人可以解释一下.我正在使用的当前方法是通过添加 shell=true 使其输出正确的输出,但正如帮助页面指出的那样,它是不安全的.我需要帮助来完成这项工作,以免我的脚本不安全.
And it returns nothing. I am not entirely sure what I am doing wrong so can someone please explain. The current method that I am using that works is by adding the shell=true which makes it output the correct output but as the help pages have pointed out it is unsafe. I need help trying to make this work so that my script isn't unsafe.
推荐答案
我认为您遇到了两个问题:
I think you're running up against two problems:
这个调用:
This call:
p = subprocess.Popen(['grep', "%s *.log"%userid]...
在没有 shell=True
的情况下不会按预期工作,因为参数列表直接传递给 os.execvp
,这要求每个项目都是一个单独的字符串表示一个论点.您已将两个单独的参数压缩成一个字符串(换句话说,grep 将foo12 *.log
"解释为模式搜索,而不是模式+文件列表).
will not work as expected without shell=True
because the list of arguments are being passed directly to os.execvp
, which requires each item to be a single string representing an argument. You've squished two separate arguments together into a single string (in other words, grep is interpreting "foo12 *.log
" as the pattern to search, and not pattern+file list).
您可以通过以下方式解决此问题:
You can fix this by saying:
p = subprocess.Popen(['grep', userid, '*.log']...)
第二个问题是,同样没有 shell=True
,execvp
不知道 *.log
是什么意思> 并将其直接传递给 grep,无需通过 shell 的通配符扩展机制.如果您不想使用 shell=True
,您可以改为执行以下操作:
The second issue is that, again without shell=True
, execvp
doesn't know what you mean by *.log
and passes it directly along to grep, without going through the shell's wildcard expansion mechanism. If you don't want to use shell=True
, you can instead do something like:
import glob
args = ['grep', userid]
args.extend(glob.glob('*.log')
p = subprocess.Popen(args, ...)
这篇关于Python 子进程 Grep的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!