2016-10-29 44 views
1

我试图在使用子进程的python脚本中执行unfluff,但结果总是空的。 如果我从shell执行它,它会好的。这里有一个例子:使用python子进程执行unfluff

从unfluff文档,我可以通过提取网页的内容:

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] 

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

回答

2

在您的命令中使用|您隐式调用OS 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参数编辑:你仍然需要Popen上的shell=True参数,可能是因为unfluff不是真的可执行文件,所以需要启动shell)

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

+0

谢谢。这几乎奏效。我现在得到了json,但空的领域。 – Miguel

+0

您尝试了哪种解决方案?第一还是第二?你可以用'shell = True'加上'unfluff'上的第二个? –

+0

好的,当第二个'unfluff'加入'shell = True'时它就起作用了。谢谢! – Miguel