启动另一个程序并充当其标准输出的程序[重复]

Posted

技术标签:

【中文标题】启动另一个程序并充当其标准输出的程序[重复]【英文标题】:A program that launches another program and acts as its stdout [duplicate] 【发布时间】:2018-05-29 05:37:55 【问题描述】:

我希望我的程序启动一些其他程序并以某种方式接收它的所有打印输出。

bash/terminall/shell(不确定我的术语)就是这样做的——你告诉它要打开什么程序,它就充当该程序的标准输出。那如何实施? (在这里求 Python 版本,当然 C/C++ 方式很好知道!)

谢谢!

【问题讨论】:

不,bash 从它调用的程序中检索标准输出。 bash 运行的程序将其标准输出直接写入 bash 将其自己的标准输出写入的同一终端。 @CharlesDuffy hm,那它的机制是什么? 什么意思?没有机制。文件句柄是从你的父进程继承的,所以如果 bash 的标准输出是一个 TTY(一个 SSH 会话,其他任何东西),那么一个 bash 启动的程序会自动将它的标准输出写入同一个 TTY,而 bash 根本不需要做任何事情. 我们经常在这里收到请求,例如,追溯将运行的最后一个命令的标准输出重定向到文件或其他东西,但 bash 无法做到这一点 - 它甚至从未见过完全没有输出,因为它直接从程序 bash 开始通过继承的 FD 到终端。 无论如何,绝对有可能在 Python 中启动一个程序并读取它的标准输出——只是这样做会让你的程序不像 bash 在启动子进程时所做的那样,除非您的 bash 代码正在执行进程替换、命令替换或其他需要程序写入 FIFO 的重定向操作。因此,“像 bash 一样”并不是对您想要的确切行为的有用描述,这使得这个问题变得非常模糊。 【参考方案1】:

在 Python 中,subprocess — Subprocess management 正是您想要的。

一个简单的例子 subprocess.check_output(["echo", "Hello World!"]) 将返回“Hello World!\n”。

【讨论】:

知识库中已经有很多 许多 答案指导人们为此目的使用子流程模块——这意味着我们可以(并且应该——参见@987654322 @,特别是 Answer Well-Asked Questions 部分,特别是关于“之前已经被问过并回答过很多次”的问题的项目符号)如果这是 OP 所要求的,则将答案作为副本关闭. 很好,我想知道这是否可以异步工作?也就是说,是否可以在子进程运行时实时捕获输出?我应该为此编辑我的问题吗? 如果还没有重复告诉你如何做到这一点,是的——但这个问题已经被问过很多次了。 @CharlesDuffy 太棒了,感谢您的帮助!

以上是关于启动另一个程序并充当其标准输出的程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本

17: 折纸问题

使用 QProcess 读取标准输出

使用重定向的标准输入处理子进程中的 kbhit

在 Python 中与另一个命令行程序交互

如何写入另一个应用程序的标准输入?