如何将输入流式传输到python Popen子流程中,并将输出流式传输到该子流程中?
我尝试使用如何将输入流式传输到python Popen子流程中,并将输出流式传输到该子流程中?,python,subprocess,popen,Python,Subprocess,Popen,我尝试使用subprocess.Popen在python中创建一个shell。作为用于测试目的的样板代码,我有: 如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu': ps=子流程。Popen( 输入('命令'), shell=True, stdin=子流程.PIPE, stdout=子流程.PIPE, stderr=子流程.PIPE, text=True ) 打印(ps.stdout.read()) time.sleep(1)#如果命令是一次性的,如dir或ech
subprocess.Popen
在python中创建一个shell。作为用于测试目的的样板代码,我有:
如果uuuu name_uuuu=='\uuuuuuu main\uuuuuu':
ps=子流程。Popen(
输入('命令'),
shell=True,
stdin=子流程.PIPE,
stdout=子流程.PIPE,
stderr=子流程.PIPE,
text=True
)
打印(ps.stdout.read())
time.sleep(1)#如果命令是一次性的,如dir或echo,则提供足够的时间来注册完成
而ps.poll()==None:#ps.poll()如果仍在运行,则返回None
尝试:
#方法一
ps.stdin.write(输入())
ps.沟通()
打印(ps.stdout.read())
#方法二
ps.stdin.write(输入())
打印(ps.communicate()[0])
#方法三
打印(ps.communicate(input())[0])
除:
持续
打印('过程已完成')
每个方法都是不同的(失败的)尝试
对于像python
这样应该打开pythoncli解释器的命令,这将完全失败。但是,对于像dir
或ls
这样的一次性命令,甚至运行python-c”“
都可以正常工作
CLI日志:
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
C:\Users\nj2u2\Desktop\test>python test.py
指挥部?回声你好
你好
工艺完成
C:\Users\nj2u2\Desktop\test>python test.py
指挥部?迪尔
驱动器C中的卷没有标签。
卷序列号为D6B7-6B8D
C:\Users\nj2u2\Desktop\test目录
2020年3月7日上午12:26。
2020年3月7日上午12:26。。
2020年3月7日08:20 PM 6811 subprocess_plus.py
2020年4月7日下午12:55 580测试
2020年3月7日晚上8:25__
2个文件7391字节
3个目录1487446302720个可用字节
工艺完成
C:\Users\nj2u2\Desktop\test>python test.py
指挥部?python
在最后一个命令python
之后,它就挂起在print(ps.stdout.read())
我想知道它为什么挂起,以及如何修复。通信方法只能用于非交互式命令,因为它发送一个一次性输入,然后等待子进程终止。这就是为什么它只能与您所称的一次性命令一起工作
但是要注意,管道不支持终端规程,在终端规程中,读取调用会自动刷新输出,并且新行会导致读取立即返回。因此,任何东西都不能保证您可以使用它向python CLI解释器提供交互式IO。管道只是流,可以进行缓冲,这样您就可以确保所有输入都将被传递,并且当输出通道关闭时(即子进程命令终止时),您将接收所有输出。输入和输出的混合方式取决于子过程命令的编程方式。如果它愿意在读取之前刷新其输出,并且您在代码中也这样做,那么交互处理是可能的,但如果它不愿意,则无法期望在每行结束后接收到某些内容。如果您的脚本使用某些命令而不是其他命令,那么问题可能与您的脚本无关,而与这些“失败”的方式有关命令被执行。您是否尝试过简单地将python CLI作为子进程打开,并向其发送一个简短的硬编码命令?这样行吗?如果没有,那么你的脚本将无法工作,你对此无能为力。程序不需要支持习惯的stdin/stdout协议,因此预计其中一些将无法与您的方法配合使用。