2011-12-01 59 views
5

我試圖掏出一個非蟒子,並允許它繼承蟒蛇的stdin和stdout。 - 我使用subprocess.Popen的Python - 子流程和蟒蛇外殼

如果我從一個控制檯調用這個可能會工作,但它肯定當我使用

(我用空閒的方式)蟒蛇外殼不工作

有什麼辦法說服蟒蛇允許非蟒子將其打印出來的stdout到蟒蛇的殼呢?

回答

6

此作品無論從腳本和交互式解釋,而不是從IDLE:

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

不能使用的空閒分配對象sys.stdinsys.stdout作爲參數傳遞給subprocess.Popen。這些對象(接口空閒shell窗口)是類文件,但它們不是真正的文件與fileno屬性處理,以及類Unix操作系統需要的fileno被指定爲標準輸入和標準輸出的子進程。我不能說Windows,但我想它有類似的要求。

+0

在Windows上,IDLE通過pythonw.exe運行,所以它甚至沒有控制檯'stdin','stdout'和'stderr'文件句柄。 – eryksun

+0

但它是一種欺騙python的方法嗎? – dmjalund

4

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