python - 使用管道后如何将子进程控制传递给常规标准输入?
问题描述
我想做的是,在 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
,因为我需要用户的输入在每次按键时生效,而不是在按下回车后才生效)?
解决方案
不幸的是,没有标准方法可以在该进程期间将您自己的标准输入拼接到其他进程的标准输入,除了从您自己的标准输入读取并写入该进程,一旦您选择写入该进程。地方。
也就是说,您可以这样做:
proc = subprocess.Popen(...) # no stdin=
并且该过程将继承您的标准输入;或者你可以这样做:
proc = subprocess.Popen(..., stdin=subprocess.PIPE, ...)
然后向该进程提供标准输入。但是一旦你选择提供它的任何标准输入,你就提供它的所有标准输入,即使这意味着你必须阅读你自己的标准输入。
Linux 提供了一个splice
系统调用(man7.org 上的文档,linux.die.net上的文档,维基百科,linux 管道数据从文件描述符到 fifo),但最好的选择可能是复制数据的后台线程。
推荐阅读
- unity3d - Unity - Vuforia 坐标系和 3D 模型注册机制
- c# - ManagedWifi 检测需要打开浏览器才能输入附加信息
- pandas - 使用 Pandas 在条形图中显示日期的最佳方式
- python - 如何在 Windows 上使用 Python 获取图像文件元数据(exif)?
- java - 使用 keytool 将 p7b 文件导入 Java Keystore
- node.js - 带有虚拟目录的 Azure AppService NodeJ
- r - 有没有办法计算变量中有多少特定值内的观察值?
- typescript - mongoose virtuals with typescript error - 包含箭头函数捕获“this”的全局值,该值隐含类型为“any”
- android - 启动android模拟器时如何显示哪些选项传递给QEMU?
- ios - 在 iOS 中调用多个服务的更好方法是什么?