我正在尝试将类似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管道。最可能的情况是子流程仍在等待输入。你知道吗
您可能希望尝试这样进行调试,请关闭stdin并查看是否有效:
如果有效,请查看子进程期望的命令结束。例如,它可能期望
\r\n
而不是\n
。如果不知道底层流程是如何工作的,很难说这里出了什么问题。你知道吗相关问题 更多 >
编程相关推荐