为什么可以';我不能从一个通过Python脚本调用的进程中获得输出吗?
基于此, 问题,我正在尝试通过Python获取进程的输出 这里有代码:为什么可以';我不能从一个通过Python脚本调用的进程中获得输出吗?,python,linux,process,Python,Linux,Process,基于此, 问题,我正在尝试通过Python获取进程的输出 这里有代码: from subprocess import Popen, PIPE connection_string = "yowsup-cli demos --yowsup --config config" popen_parameters = connection_string.split(" ") proc = Popen(popen_parameters, stdout=PIPE, stderr=PIPE) while Tr
from subprocess import Popen, PIPE
connection_string = "yowsup-cli demos --yowsup --config config"
popen_parameters = connection_string.split(" ")
proc = Popen(popen_parameters, stdout=PIPE, stderr=PIPE)
while True:
line = proc.stdout.readline()
if line != '':
#the real code does filtering here
print "Result:", line.rstrip()
proc.stdout.flush()
不幸的是,没有归还任何东西。顺便说一句,我需要与发送和接收数据的进程进行交互。我怎样才能做到这一点
谢谢 即使在发送命令的输出后,while循环也没有条件退出。 试试这个:
如果行!='':
#真正的代码在这里进行过滤
打印“结果:”,行.rstrip()
其他:
中断
首先,如果子进程实际上正在写入其标准输出,那么代码应该可以工作。如果命令中有错误,则输出可能会显示在stderr上
但是请注意,您的代码没有退出循环,因此您需要修复它,例如,在读取空字符串时调用break
但是有更好的办法。不要直接读取子进程的stdout,请使用:
问题的另一部分涉及与子进程的交互。在启动子进程并向其发送单个输入的简单情况下,仍然可以通过向其传递字符串参数来使用Popen.communicate()
。请注意,您还需要设置标准DIN管道。因此,如上所述,但:
proc = Popen(popen_parameters, stdin=PIPE, stdout=PIPE, stderr=PIPE)
data = 'data to send to child'
out, err = proc.communicate(data)
如果您与孩子的交互更复杂,您应该考虑使用为此使用的模块。虽然可以使用
Popen()
执行此操作,但在读取/写入管道的进程的缓冲和死锁方面存在一些问题,因此最好避免这些问题。感谢您的评论。如果我将连接字符串替换为“ping 192.168.0.9-c4”,那么您的代码工作得非常好。但是我仍然有两个问题:1-我需要保持与流程的连接,因为我将与它交互。在这种情况下,通信将等待该过程完成。2-与ping命令不同,我没有从yowsup得到任何答案。你知道我怎样才能把它修好吗?谢谢@谢谢你的编辑。“这是”由于输入错误,而不是无知。@user1688175-我不太熟悉yowsup cli
-从命令行运行同一命令时,您看到了什么?输出(如果有)是否显示在标准输出或标准输出上?您是否查看了peexpect
?这是正确的,但对于根本没有输出的情况,这不是一个解决方案。如果没有输出,就没有输出。我的建议是关于控制流程,最终打破无休止的循环。
proc = Popen(popen_parameters, stdin=PIPE, stdout=PIPE, stderr=PIPE)
data = 'data to send to child'
out, err = proc.communicate(data)