首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python子进程执行unfluff

使用python子进程执行unfluff
EN

Stack Overflow用户
提问于 2016-10-30 05:57:53
回答 1查看 80关注 0票数 1

我尝试使用子进程在python脚本中执行unfluff,但结果总是空的。如果我从shell中执行它,它就会正常运行。下面是一个示例:

从unfluff文档中,我可以通过以下方式提取网页内容:

代码语言:javascript
复制
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中,我使用了以下内容:

代码语言:javascript
复制
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] 

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

EN

回答 1

Stack Overflow用户

发布于 2016-10-30 06:00:21

通过在命令中使用|,您隐式地调用了OS外壳。

因此您必须启用shell=True才能做到这一点。

代码语言:javascript
复制
p = subprocess.Popen(['curl','-s',url,'|','unfluff'],stdout=subprocess.PIPE,shell=True)

注意:由于您有Popen,因此可以通过打开2个Popen实例来更简洁地完成此操作,例如如下所示:

代码语言:javascript
复制
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,但是命令行依赖于操作系统外壳,效率较低。所以如果没有它就能工作,那就更好了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40324091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档