【问题标题】:subprocess.communicate() sending garbage to process?subprocess.communicate() 向进程发送垃圾?
【发布时间】:2012-03-13 04:28:50
【问题描述】:

我在使用 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 我想阅读应用程序,然后写入它。

【问题讨论】:

  • 我接受了下面的答案,因为找到解决我的问题的方法非常重要。我还想补充一点,我需要一个 fflush(stdout);,因为输入正在被缓冲,这会导致问题。

标签: python subprocess


【解决方案1】:

来自Popen.communicate() 的文档:

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

这意味着您只能为您的子进程调用一次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 进程的真正标准输入。

【讨论】:

  • +1。您可能还决定根本不使用communicate()。例如,请参阅stackoverflow.com/questions/9322796/…
  • 是否可以等待我们传递的命令进行通信?示例:我将 cmd1、cmd2、cmd3 作为传递给通信的命令。每个命令执行后我可以等待 5s 吗?
猜你喜欢
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多