3

如何在 python 中生成或打开一个子进程并实时处理其输出?子进程根据其他系统事件随机打印输出。

这个“例子”挂起:

$./print.sh | ./echo.py挂起。

print.sh

#!/bin/bash

while [ 1 ]; do
echo 'A'
sleep 1
done

echo.py

#!/usr/bin/python
import sys

for line in sys.stdin:
  print line
4

2 回答 2

2

它不挂。echo/shell 决定,因为它正在写入管道,它将以块缓冲而不是行缓冲模式执行 I/O。如果您等待足够长的时间,或者sleep 1从 shell 脚本中删除 ,您会看到来自的输出A确实通过了。

有两种可能的解决方案:

  1. 修改子进程的程序,以便在写入足够多的输出供 Python 程序处理时刷新其缓冲区。
  2. 使用伪终端 (PTY) 而不是管道。pexpect这样做,对您隐藏了大部分复杂性。不过,它不是 的替代品subprocess
于 2012-09-20T10:49:05.330 回答
0

检查此编码片段是否有效。

猫 ech.sh

#!/bin/bash

while [ 1 ]; do
echo -n 'A'
sleep 1
done

cat in_read.py

#!/usr/bin/python
import sys
import os

while True:
  print os.read(0,1)
于 2012-09-20T11:37:46.207 回答