4

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

用例:

我有一个 python 脚本,它使用popen.

比方说foo.pyruns popento run python bar.py

然后bar.py阻塞输入。我可以得到python bar.py. 有什么方法可以将新控制台附加到正在运行的 python 实例以便能够与之交互工作?这特别有用,因为我想pdbbar.py.

4

2 回答 2

4

没门。但是你可以修改你开始的方式bar.py,以便准备接管标准输入和标准输出。

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

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

于 2012-05-04T19:33:39.110 回答
0

您不能重定向stdinstdout用于正在运行的进程。但是,您可以向调用者添加代码——从'sfoo.py读取并将其发送到's ,反之亦然。foo.pystdinbar.pystdout

在这个模型中,foo.pybar.py'sstdin和连接stdout到管道,并负责在这些管道和实际stdin/之间穿梭数据stdout

于 2012-05-04T19:29:43.473 回答