使用管道后如何将子过程控制传递给常规stdin?

时间:2018-11-14 01:49:46

标签: python subprocess pipe stdin

我想做的是,在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键后才生效)?

1 个答案:

答案 0 :(得分:1)

不幸的是,一旦选择了写入该进程,除了从自己的stdin中读取并写入该进程外,没有标准的方法可以在该进程的持续时间内将自己的stdin拼接到其他进程的stdin中。首先。

也就是说,您可以这样做:

proc = subprocess.Popen(...)  # no stdin=

,该进程将继承您的 stdin;或者您可以这样做:

proc = subprocess.Popen(..., stdin=subprocess.PIPE, ...)

,然后为该过程提供标准输入。但是,一旦您选择提供其标准输入的任何,就可以提供其标准输入的全部,即使这意味着您必须阅读自己的标准输入。

Linux提供了一个splice系统调用(documentation at man7.orgdocumentation at linux.die.netWikipedialinux pipe data from file descriptor into a fifo),但是最好的选择可能是复制它的后台线程。数据。