【发布时间】:2012-05-23 08:19:44
【问题描述】:
你好,我对 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)) 但一切都不起作用
但是,当我首先在标准输入中输入字符串时,程序工作了。
我认为程序结束时孩子的标准输出缓冲区没有填满......这只是我的选择
这个问题有解决办法吗?
编辑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")
【问题讨论】:
-
如果您在第一个
printf之后flush(stdout);会发生什么? -
显然C函数是
fflush...对不起,我的C有点生锈了。 -
1 #include
2 3 int main(){ 4 char buf[10]; 5 printf("asdfsadfasff\n"); 6 fflush(标准输出); 7 scanf("%s",buf); 8 printf("%s\n",buf); 9 } 添加fflush,结果没有改变,是不是调用fflush的时间有问题? -
哦,我的...抱歉缩进和换行不明确
-
@JoonSunKim 没有行号,它仍然是有效的 C 代码 ;)。不过看起来和我预想的一样。您还传递了一个对于您的字符缓冲区(stackoverflow.com/a/2430310/748858)来说太长的字符串。这也可能导致一些有趣的行为。
标签: python subprocess stdout popen