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

2024-06-06 21:00:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个文件通过Popen()运行另一个文件。你知道吗

# a.py
import subprocess

p = subprocess.Popen(['python3','/home/scotty/b.py'], 
stderr=subprocess.PIPE)
p.wait()

# b.py
input('???')

当我运行a.py“???”没有出现但提示仍然有效。。。为什么?我该怎么修?你知道吗

如果我删除stderr=子流程管道然后呢确实出现了。你知道吗

根据文档,输入的输出“被写入标准输出”,我没有接触标准输出。你知道吗


Tags: 文件pyimporthomeinput标准管道stderr
1条回答
网友
1楼 · 发布于 2024-06-06 21:00:26

在您的示例中,似乎每件事情的发生都好像为stderr而不是stdout打开一个管道会将stdout重定向到stderr,因为在我所做的测试中,stderr接收输入的提示。你知道吗

下面是一段在linux中适用的代码。它可能过于复杂了,因为我使用了socketpairs,这当然不是必需的,但至少它是健壮的,而且可以工作。你知道吗

##################################
# 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)

相关问题 更多 >