使用Python子进程执行无用信息删除

2024-10-01 22:37:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用subprocess在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] 

结果是一个空字符串。 那么,我做错了什么?你知道吗


Tags: pthttpcurldasaosubprocessuesem
1条回答
网友
1楼 · 发布于 2024-10-01 22:37:37

通过在命令中使用|,可以隐式地调用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参数,EDIT:您仍然需要第二个Popen上的shell=True参数,可能是因为unfluff不是一个真正的可执行文件,所以需要shell来启动)

规则是:如果你想安全,总是设置shell=True,但是命令行依赖于OS shell,效率较低。所以如果没有它也能用,那就更好了。你知道吗

相关问题 更多 >

    热门问题