stdin从管道循环过程中读取python

时间:2012-09-20 10:35:23

标签: python background-process

如何在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

2 个答案:

答案 0 :(得分:2)

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

有两种可能的解决方案:

  1. 修改子进程的程序,以便在为Python程序编写足够的输出时刷新其缓冲区。
  2. 使用伪终端(PTYs)代替管道。 pexpect这样做,隐藏了你的大部分复杂性。不过,它不是subprocess的替代品。

答案 1 :(得分:0)

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

cat 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)