[英]Python subprocess.Popen stdin from file, alter contents as a stream
[英]How can I stream input into a python Popen subprocess and stream output from it?
我正在尝试使用 subprocess.Popen 在 python 中创建一个subprocess.Popen
。 作为用于测试目的的样板代码,这就是我所拥有的:
if __name__ == '__main__':
ps = subprocess.Popen(
input('command? '),
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
print(ps.stdout.read())
time.sleep(1) # provide enough time to register completion if the command is a one-off, like dir or echo
while ps.poll() == None: # ps.poll() returns None if still running
try:
# method one
ps.stdin.write(input())
ps.communicate()
print(ps.stdout.read())
# method two
ps.stdin.write(input())
print(ps.communicate()[0])
# method three
print(ps.communicate(input())[0])
except:
continue
print('Process Finished')
每种方法都是不同的(失败的)尝试。
对于像python
这样应该打开 python CLI 解释器的命令,这完全失败了。 但是,对于dir
或ls
之类的一次性命令,甚至运行python -c "<some python>"
它都可以正常工作。
命令行日志:
C:\Users\nj2u2\Desktop\test>python test.py
command? echo hello
hello
Process Finished
C:\Users\nj2u2\Desktop\test>python test.py
command? dir
Volume in drive C has no label.
Volume Serial Number is D6B7-6B8D
Directory of C:\Users\nj2u2\Desktop\test
07/03/2020 12:26 AM <DIR> .
07/03/2020 12:26 AM <DIR> ..
07/03/2020 08:20 PM 6,811 subprocess_plus.py
07/04/2020 12:55 PM 580 test.py
07/03/2020 08:25 PM <DIR> __pycache__
2 File(s) 7,391 bytes
3 Dir(s) 1,487,446,302,720 bytes free
Process Finished
C:\Users\nj2u2\Desktop\test>python test.py
command? python
在最后一个命令python
之后,它只是挂在print(ps.stdout.read())
处。
我想知道它为什么挂起,以及如何修复它。
communicate
方法只能用于非交互式命令,因为它发送一个单次输入,然后等待子进程终止。 这就是它只能与您所谓的一次性命令一起使用的原因。
但请注意,管道不支持终端规则,其中读取调用会自动刷新 output,并且新行会导致读取立即返回。 因此,没有任何东西可以保证您可以使用它为 python CLI 解释器提供交互式 IO。 管道只是流,并且可以被缓冲,因此您可以确保所有输入都将被传递,并且当 output 通道将关闭时(即当子进程命令终止时)您将收到所有 output。 输入和output混用的方式取决于子流程指令的编程方式。 如果它愿意在读取之前刷新其 output,并且您在代码中执行相同操作,则可以进行交互式处理,但如果不这样做,则无法期望在每行结束后收到某些内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.