繁体   English   中英

Python子进程交互,为什么我的进程与Popen.communicate一起工作,而不是Popen.stdout.read()?

[英]Python subprocess interaction, why does my process work with Popen.communicate, but not Popen.stdout.read()?

我正在尝试使用subprocess模块与Python的命令行聊天机器人进行通信。 (http://howie.sourceforge.net/使用编译的win32二进制文件,我有我的理由!)

这有效:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
output = proc.communicate()

但是Popen.communicate等待进程终止(并将其发送给EOF?),我希望能够与它进行交互。 对此的明显解决方案是读取stdout / write stdin如下所示:

这不起作用:

proc = Popen('Howie/howie.exe', stdout=PIPE,stderr=STDOUT,stdin=PIPE)
while True: print proc.stdout.readline()

(请注意,我实际上使用的是基于http://code.activestate.com/recipes/440554/的更复杂的代码,但问题是相同的。)

问题是,第二种方法非常适合与cmd进行通信,但是当我运行聊天机器人时,没有任何内容。 所以我的问题是, 在使用Popen.communicate()捕获输出时有什么不同?

即我可以使用第二种方法按照正常情况使用命令行,直到我运行chatbot,此时我停止接收输出。 使用第一种方法正确显示机器人的前几行输出,但让我无法与它进行交互。

两者之间的一个主要区别是communication()在发送数据后关闭stdin。 我不知道你的具体情况,但在很多情况下,这意味着如果一个进程正在等待用户输入的结束,他将在使用communic()时获取它,并且当代码阻塞时它将永远不会得到它read()或readline()。

首先尝试添加Popen.stdin.close()并查看它是否会影响您的情况。

如果要在发送EOF后与程序进行交互,而不是使用Popen.stdin.close() ,则可以手动发送命令行End Of File字符,该字符具有相同的效果但会打开stdin。

在Python中,这个角色的转义序列是'\\x1a'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM