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

标签 python subprocess

我在使用 subprocess.communicate() 读取/写入子进程中的 stdin/stdout 时遇到问题。

这是子进程(C 语言)

#include <stdio.h>

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

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

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

我希望打印出来

test
input was test:

但是,proc.communicate() 似乎会导致 gets() 发生 EOF,从而导致子应用程序终止。我是否可以在不发送 EOF 的情况下与子应用程序进行通信? IE 我想读取应用程序然后写入它。

最佳答案

来自 Popen.communicate() 的文档:

Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate.

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

获取实时输出可能有点棘手,但在您的示例中,它应该不会太困难,因为您只是尝试读取一行。以下内容应该有效:

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 进程的标准输入。

关于python - subprocess.communicate() 向进程发送垃圾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9401671/

相关文章:

python - 从下拉选项值 Python BeautifulSoup 中抓取

python - 如何访问其基类中的类字段值?

python - __instancecheck__ - 覆盖没有效果 - 我做错了什么?

python - 集成测试多个 Celery Worker 和一个数据库支持的 Django API

Python 子进程超时终止

python - 将 mmap 与 popen 一起使用

Python - 使用子进程调用 sed?

python - 如何使用 Python 在后台运行 DOS 批处理文件?

Python pandas 无法读取带有一些奇怪编码和拆分 Pane 的旧 excel 文件

python - Cron 终止 Python 脚本?