首页 > 解决方案 > 使用管道后如何将子进程控制传递给常规标准输入?

问题描述

我想做的是,在 Python 中,以编程方式通过标准输入向进程发送一些初始命令,然后将输入传递给用户,让他们随后控制程序。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()

如何将 stdin 传回给用户(不使用raw_input,因为我需要用户的输入在每次按键时生效,而不是在按下回车后才生效)?

标签: pythonsubprocesspipestdin

解决方案


不幸的是,没有标准方法可以在该进程期间将您自己的标准输入拼接到其他进程的标准输入,除了从您自己的标准输入读取并写入该进程,一旦您选择写入该进程。地方。

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

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

并且该过程将继承您的标准输入;或者你可以这样做:

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

然后向该进程提供标准输入。但是一旦你选择提供它的任何标准输入,你就提供它的所有标准输入,即使这意味着你必须阅读你自己的标准输入。

Linux 提供了一个splice系统调用(man7.org 上的文档,linux.die.net上的文档维基百科linux 管道数据从文件描述符到 fifo),但最好的选择可能是复制数据的后台线程。


推荐阅读