繁体   English   中英

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

[英]stdin read python from piped looping process

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

这个“例子”挂起:

$./print.sh | ./echo.py $./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

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

有两种可能的解决方案:

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

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

猫ech.sh

#!/bin/bash

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

猫in_read.py

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

while True:
  print os.read(0,1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM