我尝试使用子进程在python脚本中执行unfluff,但结果总是空的。如果我从shell中执行它,它就会正常运行。下面是一个示例:
从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] 这将导致空字符串。那么,我做错了什么呢?
发布于 2016-10-30 06:00:21
通过在命令中使用|,您隐式地调用了OS外壳。
因此您必须启用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=True,但是命令行依赖于操作系统外壳,效率较低。所以如果没有它就能工作,那就更好了。
https://stackoverflow.com/questions/40324091
复制相似问题