首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >subprocess.communicate()向进程发送垃圾?

subprocess.communicate()向进程发送垃圾?
EN

Stack Overflow用户
提问于 2012-02-23 03:33:25
回答 1查看 780关注 0票数 1

我在使用subprocess.communicate()的子进程中读/写标准输入/标准输出时遇到了问题。

这是子进程(在C中)

代码语言:javascript
复制
#include <stdio.h>

int main ()
{
    char buf[128];
    printf("test\n");
    gets(buf);
    printf("%s", buf);
    return 0;
}

这是python中调用该子程序的程序。

代码语言:javascript
复制
import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

stdin, stderr = proc.communicate()
print stdin
proc.communicate(stdin)
stdin, stderr = proc.communicate()
print stdin

print stdin

我希望这能打印出来。

代码语言:javascript
复制
test
input was test:

但是,proc.communicate()似乎会导致gets()的EOF,从而导致子应用程序终止。有没有什么方法可以在不发送EOF的情况下与子应用程序通信?也就是说,我想先读取应用程序,然后再写入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-23 03:44:00

来自Popen.communicate()的文档

将数据发送到标准输入。从stdout和stderr读取数据,直到到达文件末尾。等待进程终止。

这意味着您只能为子流程调用一次communicate()

获取实时输出可能有点棘手,但在您的示例中应该不会太难,因为您只尝试读取一行。下面的代码应该可以工作:

代码语言:javascript
复制
import subprocess

proc = subprocess.Popen('./test', stdin=subprocess.PIPE, stdout=subprocess.PIPE)

outdata = proc.stdout.readline()
print outdata
outdata, errdata = proc.communicate('output was ' + outdata)
print outdata

注意,我重命名了一些变量,因为子进程的输出对于Python进程来说并不是真正的stdin。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9401671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档