小编rav*_*c95的帖子

捕获输出时,使用带有select和pty的子进程挂起

我正在尝试编写一个能够与其他程序交互的python程序.这意味着发送stdin并接收stdout数据.我不能使用pexpect(尽管它确实激发了一些设计).我现在正在使用的过程是这样的:

  1. 将pty附加到子进程的stdout
  2. 循环直到子进程通过检查退出 subprocess.poll
    • 当stdout中有可用数据时,该数据立即写入当前标准输出.
  3. 完!

我一直在制作一些代码(下面)的原型,但它似乎有一个瑕疵让我烦恼.子进程完成后,如果我在使用时未指定超时,则父进程将挂起select.select.我真的不想设置超时.它看起来有点脏.但是,我尝试解决这个问题的所有其他方法似乎都不起作用.Pexpect似乎通过使用os.execvpty.fork不是subprocess.Popenpty.openpty我不喜欢的解决方案来绕过它.我是如何检查子流程的生命周期的?我的方法不正确吗?

我正在使用的代码如下.我在Mac OS X 10.6.8上使用它,但我也需要它在Ubuntu 12.04上工作.

这是子进程运行程序runner.py:

import subprocess
import select
import pty
import os
import sys

def main():
    master, slave = pty.openpty()

    process = subprocess.Popen(['python', 'outputter.py'], 
            stdin=subprocess.PIPE, 
            stdout=slave, stderr=slave, close_fds=True)

    while process.poll() is None:
        # Just FYI timeout is the last argument to select.select
        rlist, wlist, xlist = select.select([master], [], [])
        for f in rlist:
            output = os.read(f, 1000) # This …
Run Code Online (Sandbox Code Playgroud)

python select subprocess pty

6
推荐指数
2
解决办法
7359
查看次数

标签 统计

pty ×1

python ×1

select ×1

subprocess ×1