簡體   English   中英

Popen([…],stderr = PIPE)會忽略生成的python程序的input()消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM