【问题标题】:Python - subprocesses and the python shellPython - 子进程和 python shell
【发布时间】:2012-01-10 08:11:27
【问题描述】:

我正在尝试使用非 python 子进程并允许它从 python 继承标准输入和标准输出。 - 我正在使用 subprocess.Popen

如果我从控制台调用这可能会起作用,但是当我使用 python shell 时它肯定不起作用

(顺便说一下我用的是IDLE)

有什么方法可以说服 python 允许非 python 子进程将它的标准输出打印到 python shell?

【问题讨论】:

    标签: python popen python-idle subprocess


    【解决方案1】:

    这适用于脚本和交互式解释器,但不适用于 IDLE:

    subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin)
    

    您不能使用 IDLE 分配给 sys.stdinsys.stdout 的对象作为 subprocess.Popen 的参数。这些对象(IDLE shell 窗口的接口)是类似文件的,但它们不是具有fileno 属性的真实文件句柄,并且类 Unix 操作系统需要将 fileno 指定为子进程的标准输入或标准输出.我不能代表 Windows,但我想它有类似的要求。

    【讨论】:

    • 在 Windows IDLE 上通过 pythonw.exe 运行,因此它甚至没有控制台 stdinstdoutstderr 文件句柄。
    【解决方案2】:

    Taymon 的回答直接解决了您的问题,因为 IDLE 的标准输入/标准输出实际上是类似文件的对象,而不是与控制台/终端关联的标准文件流。此外,在 Windows IDLE 中运行 pythonw.exe,它甚至没有附加的 win32 控制台。

    也就是说,如果您只需要将程序的输出实时打印给用户,那么在许多情况下(但不是全部)您可以逐行读取输出并相应地回显它。以下适用于我在 Windows IDLE 中。它演示了从管道stdout 逐行读取。它还显示了如果进程缓冲管道会发生什么,在这种情况下,readline 将阻塞,直到缓冲区已满或管道关闭。可以使用某些程序手动禁用此缓冲(例如 Python 解释器的 -u 选项),并且有适用于 Unix 的解决方法,例如 stdbuf

    test1.py

    import sys
    import subprocess
    
    def test(cmd):
        p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
                             stderr=subprocess.PIPE)
        it = iter(p.stdout.readline, b'')
        for line in it:
            print(line.rstrip().decode('ascii'))
    
    print('Testing buffered subprocess...')
    test([sys.executable, 'test2.py'])
    
    print('\nTesting unbuffered subprocess...')
    #-u: unbuffered binary stdout and stderr
    test([sys.executable, '-u', 'test2.py']) 
    

    test2.py:

    import time
    
    for i in range(5):
        print(i)
        time.sleep(1)
    

    IDLE 中的输出应该如下,第一组数字在延迟后一次打印,第二组逐行打印。

    Testing buffered subprocess...
    0
    1
    2
    3
    4
    
    Testing unbuffered subprocess...
    0
    1
    2
    3
    4
    

    【讨论】:

      猜你喜欢
      • 2016-01-04
      • 2011-11-16
      • 2018-06-09
      • 2023-03-06
      • 2021-02-13
      • 2010-10-30
      • 2020-04-22
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多