【问题标题】:Process in python - fetch stdout of non-terminating processpython中的进程 - 获取非终止进程的标准输出
【发布时间】:2015-07-16 15:54:40
【问题描述】:

假设有一个程序用不同的输入产生不同的输出,如果输入是一个特定的值则终止。例如,它可以用 C++ 编写:

int main() {
    int i;
    while(true) {
        cin >> i;
        if (i) cout << i << endl;
        else break;
    }
    return 0;
}

在这个程序中,如果你输入一个整数,它会在屏幕上打印出来。在您输入0 之前,程序永远不会终止。

那我怎样才能用 Python 立即获取一个标准输入对应的标准输出呢?也就是说,如果我给标准输入一个“1”,我会期望立即从标准输出中获取一个“1”,而这个过程还没有终止。


结论:有两种实现方式。

  1. 使用subprocess.Popen,将子进程的stdout或stdin当作文件,写入stdin(需要'\n'),用readline从stdout读取

  2. 使用库 pexpect。

【问题讨论】:

  • 不能直接读取子进程的stdout吗?
  • 对于我们这些不读 C++ 的人来说,你应该提到那个输出是什么样子的;具体来说,它是否以换行符终止?
  • 如果使用subprocess.Popen模块,直接读取,会一直等待,什么也不做。
  • 不要回答你的问题。如果您愿意,您可以发布自己的答案。

标签: python subprocess stdout


【解决方案1】:

使用subprocess.Popen()

>>> import subprocess
>>> p = subprocess.Popen(['/your/cpp/program'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> p.stdin.write('1\n')
>>> p.stdout.readline()
'1\n'
>>> p.stdin.write('10\n')
>>> p.stdout.readline()
'10\n'
>>> p.stdin.write('0\n')
>>> p.stdout.readline()
''
>>> p.wait()
0

【讨论】:

  • 可能有buffering issues in the child(在这种情况下,由于endl 上的隐式刷新而没有)和父级(您的脚本)。后者您可以在 Python 3 上使用 p.stdin.flush()bufsize=1 修复,其中 bufsize 默认为非零。
猜你喜欢
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多