子流程 - Grep Broken Pipe

时间:2012-05-31 18:30:25

标签: python grep subprocess

Python 2.4.x在这里。

一直试图让subprocess与glob一起工作。

嗯,这是问题所在。

def runCommands(thecust, thedevice):
    thepath='/smithy/%s/%s' % (thecust,thedevice)
    thefiles=glob.glob(thepath + '/*.smithy.xml')
    p1=subprocess.Popen(["grep", "<record>"] + thefiles, stdout=subprocess.PIPE)
    p2=subprocess.Popen(['wc -l'], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    thecount=p2.communicate()[0]
    p1.wait()

我在屏幕上收到许多“grep:写输出:断管”错误。

它必须是一些简单的我想念的,我无法发现它。有什么想法吗?

提前谢谢。

2 个答案:

答案 0 :(得分:5)

这里的问题是,对于p2,您的参数列表应为['wc', '-l']而不是['wc -l']

目前正在寻找一个名为'wc -l'的可执行文件来运行而不能找到它,因此p2会立即失败并且没有任何内容连接到p1.stdout,这会导致管道错误

请尝试以下代码:

def runCommands(thecust, thedevice):
    thepath='/smithy/%s/%s' % (thecust,thedevice)
    thefiles=glob.glob(thepath + '/*.smithy.xml')
    p1=subprocess.Popen(["grep", "<record>"] + thefiles, stdout=subprocess.PIPE)
    p2=subprocess.Popen(['wc', '-l'], stdin=p1.stdout, stdout=subprocess.PIPE)
    p1.stdout.close()
    thecount=p2.communicate()[0]
    p1.wait()

答案 1 :(得分:0)

这似乎是因为在grep完成输出之前你正在关闭p1.stdout。也许你打算关闭pt.stdin?但是,似乎没有理由关闭其中任何一个,所以我只是删除p1.stdout.close()语句。