我正在尝试将类似REPL的命令行程序集成到Python项目中。命令行程序接受一个输入字符串并返回一个输出字符串,它在自己运行时工作正常。问题是,当我尝试使用Popen().stdout.peek()
或.read()
时,它会挂起并且不会产生输出。
>>> p = Popen('Test.exe', stdin=PIPE, stdout=PIPE, stderr=PIPE)
>>> p.stdin.write(bytes('message\n', 'utf-8'))
8
>>> p.stdin.flush()
>>> p.stdout.peek() # Hangs
有趣的是,如果命令行程序也是用Python编写的,那么它确实有效,但是当使用我真正想要使用它的那个时,它会挂起。在命令行中手动运行时,两个程序都按预期运行。我也不能使用p.communicate('message')
,因为进程是有状态的,我需要执行多个命令。
我相信最可能的情况是你必须在子进程开始执行和打印之前关闭stdin PIPE。最有可能的情况是子进程仍在输入中。
您可能希望尝试调试,关闭stdin并查看是否有效:
p.stdin.close()
p.stdout.read()
如果有效,请查看子进程期望的命令END。例如。它可能是因为它期望\r\n
注入\n
。在不知道基础过程如何工作的情况下,很难说出这里出了什么问题。