热门标签:
Q:

Python-子流程和python shell

我试图掏出一个非python子进程,并允许它从python继承stdin和stdout。 -我正在使用subprocess。波本

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

(顺便说一句我正在使用IDLE)

有没有办法说服python允许非python子进程将其stdout打印到python shell?

原网址
A:

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

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

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

所有回答

共 1 条

author avatar

Taymon的答案直接解决了您的问题,因为IDLE的stdin/stdout实际上是类似文件的对象,而不是与控制台/终端关联的标准文件流。 此外,在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)

空闲时的输出应如下,第一组数字在延迟后一次性打印,第二组数字逐行打印。

Testing buffered subprocess...
0
1
2
3
4

Testing unbuffered subprocess...
0
1
2
3
4

相似问题