![](/img/trans.png)
[英]capture stderr from python subprocess.Popen(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
[英]Popen([…], stderr=PIPE) ignores input() message from spawned python program
我有一個文件通過Popen()運行另一個文件。
# a.py
import subprocess
p = subprocess.Popen(['python3','/home/scotty/b.py'],
stderr=subprocess.PIPE)
p.wait()
# b.py
input('???')
當我運行a.py“ ???” 沒有出現,但提示仍然有效...為什么? 我該如何解決?
如果我刪除stderr = subprocess.PIPE,則“ ???” 確實出現。
根據文檔,輸入“被寫入標准輸出”的輸出,我沒有碰到標准輸出。
看來,在您的示例中,所有事情似乎都發生了,好像為stderr打開管道而不是為stdout打開管道具有將stdout重定向到stderr的效果,因為在我進行的測試中,stderr會收到輸入的提示。
以下是適用於Linux的代碼。 它可能過於復雜,因為我使用了套接字對,這當然不是必須的,但至少它是健壯的並且可以工作。
##################################
# a.py
import subprocess
import socket
import select
esock, echildsock = socket.socketpair()
osock, ochildsock = socket.socketpair()
p = subprocess.Popen(['python3','b.py'],
stderr=echildsock.fileno(),
stdout=ochildsock.fileno())
while p.poll() is None:
r, w, x = select.select([esock, osock],[],[], 1.0)
if not r:
continue # timed out
for s in r:
print('stdout ready' if s is osock else 'stderr ready')
data = s.recv(1024)
print('received', data.decode('utf8'))
osock.shutdown(socket.SHUT_RDWR)
osock.close()
esock.shutdown(socket.SHUT_RDWR)
esock.close()
##################################
# b.py
res = input('???')
print('in b:', res)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.