我试图掏出一个非python子进程,并允许它从python继承stdin和stdout。 -我正在使用subprocess。波本
如果我从控制台调用,这可能会起作用,但当我使用python shell时,它肯定不起作用
(顺便说一句我正在使用IDLE)
有没有办法说服python允许非python子进程将其stdout打印到python shell?
我试图掏出一个非python子进程,并允许它从python继承stdin和stdout。 -我正在使用subprocess。波本
如果我从控制台调用,这可能会起作用,但当我使用python shell时,它肯定不起作用
(顺便说一句我正在使用IDLE)
有没有办法说服python允许非python子进程将其stdout打印到python shell?
这既适用于脚本,也适用于交互式解释器,但不适用于IDLE:
subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin)
您不能使用IDLE分配给sys.stdin
和sys.stdout
的对象作为subprocess.Popen
的参数。 这些对象(空闲shell窗口的接口)是类似文件的,但它们不是具有fileno
属性的真正文件句柄,类Unix操作系统需要将fileno指定为子进程的stdin或stdout。 我不能为Windows说话,但我想它有类似的要求。
Taymon的答案直接解决了您的问题,因为IDLE的stdin/stdout实际上是类似文件的对象,而不是与控制台/终端关联的标准文件流。 此外,在Windows IDLE中,使用pythonw运行。exe,它甚至没有附加的win32控制台。
也就是说,如果您只需要将程序的输出实时打印给用户,那么在许多情况下(但不是全部),您可以逐行读取输出并相应地回显它。 以下内容适用于我在Windows IDLE中。 它演示了逐行从管道
stdout
读取。 它还显示了如果进程缓冲管道会发生什么,在这种情况下,readline
将阻塞,直到缓冲区已满或管道关闭。 可以使用某些程序(例如Python解释器的-u选项)手动禁用此缓冲,并且还有Unix的解决方法,例如stdbuf。test1.py
test2.py:
空闲时的输出应如下,第一组数字在延迟后一次性打印,第二组数字逐行打印。