Python subprocess grep命令每次都返回不同的答案

时间:2013-03-14 20:51:06

标签: python random grep subprocess

我正在尝试使用带有代码的python在文件上启动grep:

def runProcess(self, cmd):
    p = subprocess.Popen(cmd, bufsize=16000, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
    return iter(p.stdout.readline, b'')

问题是我每次启动时都会得到不同的匹配。在返回对象中简单地跳过一些行。就像缓冲区被覆盖一样。我已经尝试过使用子进程找到的各种方法来完成这项工作,但都会导致同样的问题。

有关我直接在shell中测试我的grep命令的信息,它运行正常,这是我作为cmd参数传递给我的函数

['egrep', '-wi', '-nr', "'keyword1|keyword2|blabla'", 'test/match_inside.txt']

我也试过为bufsize使用不同的值(并且没有值为c)

2 个答案:

答案 0 :(得分:2)

当您改为调用时,问题就会消失(在我的测试中):

['egrep', '-wi', '-nr', 'keyword1|keyword2|blabla', 'test/match_inside.txt']

docs for Popen表示shlex.split()演示了如何将命令行参数转换为字符串列表。在他们的示例中,外部引用将从单个参数中删除。

编辑:我们对bash的熟悉可能会误导我们。但是Bash只是另一种脚本语言。如果输入

grep 'a|b|c' target.txt

bash正在调用操作系统调用(exec或Linux上的某些变体)来创建新的grep进程。 Bash解析该命令并删除引号;它们不是grep选项的一部分,它们可以通过分组标记帮助bash扫描您的输入。 Grep将传递一个字符串数组参数(这就是argv在C中的含义),因此参数不需要用引号括起来;参数的结构和分组由字符串数组创建。

使用时

"'keyword1|keyword2|blabla'"
在python中,你实际上是在传递

'keyword1|keyword2|blabla'

on grep as complete string,当你真的只想要grep

keyword1|keyword2|blabla

作为argv。

中索引3中的字符串(取决于前面的args的#)

答案 1 :(得分:1)

我无法发表评论,但我无法阻止自己提出要求:

为什么要在Python中运行grep?并与子进程?如果您 使用Python,那么我强烈建议您阅读Python RE。它比grep更强大,总而言之(在我看来)更容易理解和控制。

编辑:问题是务实的。我想知道原因。