【问题标题】:Execute unfluff with python subprocess使用 python 子进程执行 unfluff
【发布时间】:2016-10-30 20:10:20
【问题描述】:

我正在尝试使用子进程在 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] 

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

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    通过在您的命令中使用|,您将隐式调用 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,但命令行依赖于操作系统外壳,效率较低。所以如果没有它也能工作,那就更好了。

    【讨论】:

    • 谢谢。这几乎奏效了。我现在得到了 json 但有空字段。
    • 您尝试过哪种解决方案?第一还是第二?你能把shell=True 加到第二个unfluff 吗?
    • 好的,当将shell=True 添加到第二个unfluff 时,它起作用了。谢谢!
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-19
    • 2016-05-07
    • 1970-01-01
    • 2019-06-21
    • 2014-06-29
    • 2013-11-02
    相关资源
    最近更新 更多