【问题标题】:Python: Subprocess cannot get the process' outputsPython:子进程无法获取进程的输出
【发布时间】:2015-04-08 06:04:27
【问题描述】:

背景信息:

我正在编写一个 Python 应用程序,它将接收 WhatsApp 消息并根据提供的命令执行一些操作。为此,我安装了 yowsup,它也是一个处理 WhatsApp 消息传递的 Python 应用程序。

策略:

Yowsup 有一个很好的接口来发送和接收消息,所以我的想法是通过 Popen 启动进程并处理标准输入、标准输出和标准错误。 为此,我编写了以下代码:

from subprocess import Popen, PIPE
statement = "sudo /home/pi/yowsup/yowsup-cli demos --yowsup --config /home/pi/yowsup/config"
yowsup = Popen(statement.split(" "), stdout=PIPE, stdin=PIPE, stderr=PIPE)

while True:

    output = yowsup.stdout.readline()
    if output != "":
        print output.rstrip()

问题:

代码没有返回任何消息,所以我更改了语句以检查我的代码是否正常:

statement = "ping 192.168.0.9 -c 4"

宾果!使用命令ping 代码运行良好。

我的问题:

  • 为什么我无法使用 yowsup 应用程序处理标准输入和标准输出以及如何使其工作?

  • yowsup 也是一个 Python 应用程序有什么作用吗?

【问题讨论】:

  • 尝试使用pexpect,我不认为subprocess可以做这种事情。
  • 为什么不能使用 Python API(导入模块、调用函数)而不是控制 cli 应用程序?如果您不向管道中写入任何内容,为什么要设置stdin=PIPE。不读为什么要设置stderr=PIPE?提供与yowsup-cli(手动)成功交互的示例。 Read the discussion (including the links in the comments)

标签: python raspberry-pi popen yowsup


【解决方案1】:

"sudo /home/pi/yowsup/yowsup-cli demos --yowsup --config /home/pi/yowsup/config",这里 --yowsup 启动一个交互式客户端等待输入。在它完成运行之前,您无法获得输出。
还要确保yowsup-cli 是可执行的或以python yowsup-cli 开头。
yowsup-cli 没有接收消息的选项。您必须import yowsup 并使用该库来接收消息。

【讨论】: