Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将输入流式传输到python Popen子流程中,并将输出流式传输到该子流程中?_Python_Subprocess_Popen - Fatal编程技术网

如何将输入流式传输到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协议,因此预计其中一些将无法与您的方法配合使用。