python - 从刷新与未刷新的缓冲区中读取

标签 python c shell ipc

我有一个脚本 parent.py 试图从 Python 中的子进程 sub.py 读取标准输出。

parent.py:

#!/usr/bin/python
import subprocess
p = subprocess.Popen("sub.py", stdout=subprocess.PIPE)
print p.stdout.read(1)

和子进程,sub.py:

#!/usr/bin/python
print raw_input( "hello world!" )

我希望运行 parent.py 来打印“hello world!”中的“h”。实际上,它挂了。我只能通过将 -u 添加到 sub.py 的 she-bang 行来获得预期的行为。

这让我感到困惑,因为当 sub.py 直接从 shell 运行时,-u 开关没有任何区别;与 parent.py 不同,shell 以某种方式知道未刷新的输出流。

我的目标是运行一个 C 程序作为子进程,所以我无法控制它是否刷新标准输出。与从 subprocess.Popen 运行相同内容的 Python 相比,shell 如何更好地访问进程的标准输出?我是否能够从不刷新其缓冲区的 C 程序中读取这样的标准输出流?

编辑:

这是一个基于 korylprince 评论的更新示例...

## capitalize.sh ##
#!/bin/sh

while [ 1 ]; do
    read s
    echo $s | tr '[:lower:]' '[:upper:]'
done

########################################

## parent.py ##
#!/usr/bin/python 
from subprocess import Popen, PIPE

# cmd = [ 'capitalize.sh' ] # This would work
cmd = [ 'script', '-q', '-f', '-c', 'capitalize.sh', '/dev/null']

p = Popen(cmd, stdin=PIPE)
p.stdin.write("some string\n")
p.wait()

当运行 script 时,我稳定地打印换行符(如果这是 Python 子进程,它会引发 EOFerror)。

最佳答案

另一种选择是

p = subprocess.Popen(["python", "-u", "sub.py"], stdout=subprocess.PIPE)

或建议here .

我的经验是,是的,您无需任何额外努力就可以从大多数 C 程序中读取。

Python 解释器采取额外的步骤来缓冲其输出,这就是为什么它需要 -u 开关来禁用输出缓冲。您的典型 C 程序不会这样做。

除了 Python 解释器之外,我没有遇到任何程序(C 或其他),我希望它能工作但不在子 shell 中。

关于python - 从刷新与未刷新的缓冲区中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632767/

相关文章:

python - Keras导入模型AttributeError : 'NoneType' object has no attribute 'op'

python - 了解Python3中类变量的范围

bash - 使用 shell 脚本打开新的 Ubuntu 选项卡,然后在这些新选项卡中运行命令

macos - 操作系统 X : equivalent of Linux's wget

python - 可增长的 wxpython listctrl 列

python - 如何为 Python Elasticsearch mSearch 创建请求主体

c - C 中二叉树最小堆实现的各种问题

c - 在递归函数中返回和使用多个树结构

c - Windows 中的用户空间 APC 队列长度

ruby - 我应该如何在 Ruby 中检查 EOF