我試圖掏出一個非蟒子,並允許它繼承蟒蛇的stdin和stdout。 - 我使用subprocess.Popen的Python - 子流程和蟒蛇外殼
如果我從一個控制檯調用這個可能會工作,但它肯定當我使用
(我用空閒的方式)蟒蛇外殼不工作
有什麼辦法說服蟒蛇允許非蟒子將其打印出來的stdout到蟒蛇的殼呢?
我試圖掏出一個非蟒子,並允許它繼承蟒蛇的stdin和stdout。 - 我使用subprocess.Popen的Python - 子流程和蟒蛇外殼
如果我從一個控制檯調用這個可能會工作,但它肯定當我使用
(我用空閒的方式)蟒蛇外殼不工作
有什麼辦法說服蟒蛇允許非蟒子將其打印出來的stdout到蟒蛇的殼呢?
此作品無論從腳本和交互式解釋,而不是從IDLE:
subprocess.Popen(whatever, stdin=sys.stdout, stdout=sys.stdin)
不能使用的空閒分配對象sys.stdin
和sys.stdout
作爲參數傳遞給subprocess.Popen
。這些對象(接口空閒shell窗口)是類文件,但它們不是真正的文件與fileno
屬性處理,以及類Unix操作系統需要的fileno被指定爲標準輸入和標準輸出的子進程。我不能說Windows,但我想它有類似的要求。
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
在Windows上,IDLE通過pythonw.exe運行,所以它甚至沒有控制檯'stdin','stdout'和'stderr'文件句柄。 – eryksun
但它是一種欺騙python的方法嗎? – dmjalund