我尝试使用子进程在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]
导致空字符串。 那么,我做错了什么?
答案 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,效率较低。因此,如果它没有它,它会更好。