当 p.stdout.read(-1) 被阻塞时-6ren"> 当 p.stdout.read(-1) 被阻塞时-你好,我对 Python 子进程模块有疑问 我想与子进程交互(例如:子进程的标准输入、标准输出) 这是子程序的代码 1 #include 2 3 int main(){ 4 -6ren">
gpt4 book ai didi

Python

当 p.stdout.read(-1) 被阻塞时

转载 作者:行者123 更新时间:2023-11-28 22:02:50 27 4
gpt4 key购买 nike

你好,我对 Python 子进程模块有疑问

我想与子进程交互(例如:子进程的标准输入、标准输出)

这是子程序的代码

  1 #include <stdio.h>
2
3 int main(){
4 char buf[1024];
5 printf("asdfsadfasff\n");
6 scanf("%s",buf);
7 printf("%s\n",buf);
8 }

这段代码很简单,打印字符串,等待输入,打印输入字符串

接下来是python代码

  1 #!/usr/bin/python
2 from subprocess import *
3
4 fd = Popen(["./random"],stdin=PIPE,stdout=PIPE)
5 print "pid = %d"%(fd.pid) # print pid
6 result = ""
7 result = fd.stdout.read(-1) # read
8 print result
9 fd.stdin.write("write write write!!!\n")
10 result = fd.stdout.read(-1)
11 print result

在这种情况下,我预计这个程序会运行良好,但在第 7 行(fd.stdout.read(-1) 被阻塞并且无法运行

我更改了读取函数的参数 (read(-1), read(1), read(), read(1024)) 但一切都不起作用

但是,当我首先在 stdin 中输入字符串时,程序运行正常。

我认为当程序结束时 child 的标准输出缓冲区没有被填充...这只是我的选择

这个问题有解决办法吗?

编辑1。当我首先执行打印字符串的程序,并等待用户输入如“sudo su”效果很好,符合我的预期

我不明白为什么这个案例运作良好

  1 from subprocess import *
2
3 fd = Popen(["sudo","su"],stdin=PIPE,stdout=PIPE)
4
5 print fd.stdout.read(-1)
6 print fd.stdin.write("asdfasdfas\n")

最佳答案

子进程 ./random 使用 stdio,当进程的标准输出不是 tty 设备时,它默认执行“全缓冲”而不是“行缓冲” .由于 python 通过管道(不是 tty 设备)运行进程,程序正在缓冲其输出,而不是在 scanf 调用时打印它。缓冲区仅在 (a) 填满时刷新(写入标准输出); (b) 当使用 fflush 调用显式刷新时;或 (c) 在程序退出时。

您可以修改子进程以执行显式 fflush 调用,或者您可以使用来自 Python 的伪 tty,例如 pexpectsh . (请注意,sh 模块默认使用 pty 仅用于输出,但这通常就足够了。)或者,在这种情况下,您正在运行的程序只是“看起来是交互式的”(但实际上是完全可预测),您可以使用预先提供的已知输入序列运行​​它:

fd = Popen(["./random"], stdin=PIPE, stdout=PIPE)
result = fd.communicate("write write write!!!\n")[0]

尽管如此,您当然会将所有标准输出输入混合在一起,并且必须将它打印的两行分开(在这种特殊情况下)。

关于Python <p = Popen( ["command"), stdout=PIPE)> 当 p.stdout.read(-1) 被阻塞时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10607211/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com