使用python子进程执行unfluff

时间:2016-10-29 21:57:53

标签: python subprocess

我尝试使用子进程在python脚本中执行unfluff,但结果始终为空。 如果我从shell执行它,它就可以了。这是一个例子:

从不完整的文档中我可以通过以下方式提取网页内容:

curl -s 'http://observador.pt/2016/10/29/espanha-e-portugal-sao-unicos-paises-da-ue-sem-populismo-xenofobo-diz-antonio-costa' | unfluff

这会产生一个很好的json,具有良好的内容提取。 现在,在python我使用以下内容:

import subprocess

url = 'http://observador.pt/2016/10/29/espanha-e-portugal-sao-unicos-paises-da-ue-sem-populismo-xenofobo-diz-antonio-costa'

p = subprocess.Popen(['curl','-s',url,'|','unfluff'],stdout=subprocess.PIPE)
print p.communicate()[0] 

导致空字符串。 那么,我做错了什么?

1 个答案:

答案 0 :(得分:2)

通过在命令中使用|,您可以隐式调用操作系统shell。

所以你必须启用shell=True来做到这一点。

p = subprocess.Popen(['curl','-s',url,'|','unfluff'],stdout=subprocess.PIPE,shell=True)

注意:由于您拥有Popen,因此可以通过打开2个Popen实例以更清晰的方式执行此操作,例如:

p1 = subprocess.Popen(['curl','-s',url],stdout=subprocess.PIPE)
p2 = subprocess.Popen('unfluff',stdin=p1.stdout,stdout=subprocess.PIPE)
print(p2.communicate()[0])

(那么你不需要shell=True参数,编辑:你仍然需要第二个shell=True上的Popen参数可能因为unfluff不是真的一个可执行文件,所以需要shell启动)

规则是:如果您想要安全,请始终设置shell=True,但命令行则取决于操作系统shell,效率较低。因此,如果它没有它,它会更好。