Python:与* nix中正在运行的进程的STDIN / OUT交互

时间:2012-05-04 17:55:16

标签: python unix stdout stdin

有没有办法将控制台的STDIN / STDOUT连接到已经运行的进程?

使用案例

我有一个python脚本,它使用popen在命令行上运行另一个python脚本。

假设foo.py运行popen来运行python bar.py

然后bar.py阻止输入。我可以获得python bar.py的PID。有没有办法将新的控制台附加到正在运行的python实例,以便能够以交互方式工作?这特别有用,因为我想在pdb内运行bar.py

2 个答案:

答案 0 :(得分:4)

没办法。 但是你可以修改你开始bar.py的方式,以便准备好接管stdin和stdout。

一个简单的方法是创建命名管道并在Popen调用中将它们作为stdin / stdout提供。然后,您可以从shell(exec <pipe1 >pipe2)连接到这些管道并进行交互。这样做的缺点是必须连接到管道以查看进程正在执行的操作。虽然您可以通过在日志文件上使用tee来解决这个问题,但根据bar.py的终端功能需求,这种互动可能不是最大的乐趣。

更好的方法是将诸如GNU screentmux的终端多路复用器合并到您的进程树中。这些工具可以创建运行应用程序的虚拟终端。然后,您可以随时将任何其他终端连接和分离到此终端缓冲区。在您的具体情况下,foo.py将运行screentmux,它将在完整(VT100)终端仿真中运行python bar.py。也许这会解决你的问题。

答案 1 :(得分:0)

您无法为正在运行的进程重定向stdinstdout。但是,您可以向来电者foo.py添加代码,该代码会从foo.py的{​​{1}}中读取并发送给stdin的{​​{1}}反之亦然。

在此模型中,bar.py会将stdout的{​​{1}}和foo.py连接到管道,并负责在这些管道和真实的{{1}之间传输数据}} / bar.py