我想做的是,在Python中,通过stdin以编程方式向进程发送一些初始命令,然后将输入传递给用户,以让他们随后控制程序。 Python程序应该只等到子进程由于用户输入而退出。本质上,我想做的事情类似于:
import subprocess
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE)
# Send initial commands.
p.stdin.write(b"three\ninitial\ncommands\n")
p.stdin.flush()
# Give over control to the user.
# …Although stdin can't simply be reassigned
# in post like this, it seems.
p.stdin = sys.stdin
# Wait for the subprocess to finish.
p.wait()
我如何将标准输入传递回用户(不使用raw_input
,因为我需要用户输入才能在每次按键时都生效,而不仅仅是在按Enter键后才生效)?>
答案 0 :(得分:1)
不幸的是,一旦选择了写入该进程,除了从自己的stdin中读取并写入该进程外,没有标准的方法可以在该进程的持续时间内将自己的stdin拼接到其他进程的stdin中。首先。
也就是说,您可以这样做:
proc = subprocess.Popen(...) # no stdin=
,该进程将继承您的 stdin;或者您可以这样做:
proc = subprocess.Popen(..., stdin=subprocess.PIPE, ...)
,然后为该过程提供标准输入。但是,一旦您选择提供其标准输入的任何,就可以提供其标准输入的全部,即使这意味着您必须阅读自己的标准输入。
Linux提供了一个splice
系统调用(documentation at man7.org,documentation at linux.die.net,Wikipedia,linux pipe data from file descriptor into a fifo),但是最好的选择可能是复制它的后台线程。数据。