有没有办法将控制台的 STDIN/STDOUT 附加到已经运行的进程?
用例:
我有一个 python 脚本,它使用popen
.
比方说foo.py
runs popen
to run python bar.py
。
然后bar.py
阻塞输入。我可以得到python bar.py
. 有什么方法可以将新控制台附加到正在运行的 python 实例以便能够与之交互工作?这特别有用,因为我想pdb
在bar.py
.
没门。但是你可以修改你开始的方式bar.py
,以便准备接管标准输入和标准输出。
一个简单的方法是创建命名管道并在Popen
调用中将它们作为标准输入/标准输出提供。然后,您可以从您的 shell ( exec <pipe1 >pipe2
) 连接到这些管道并进行交互。这样做的缺点是您必须连接到管道才能查看进程在做什么。虽然您可以通过tee
在日志文件上使用来解决这个问题,但根据终端能力需求,bar.py
这种交互可能不是最大的乐趣。
更好的方法是将终端多路复用器(如GNU screen或tmux )合并到您的进程树中。这些工具可以创建运行应用程序的虚拟终端。然后,您可以随时将任何其他终端附加和分离到此终端缓冲区。在您的特定情况下,foo.py
将运行screen
or tmux
,它将python bar.py
在完整的(VT100)终端仿真中运行。也许这会解决你的问题。
您不能重定向stdin
或stdout
用于正在运行的进程。但是,您可以向调用者添加代码——从'sfoo.py
读取并将其发送到's ,反之亦然。foo.py
stdin
bar.py
stdout
在这个模型中,foo.py
将bar.py
'sstdin
和连接stdout
到管道,并负责在这些管道和实际stdin
/之间穿梭数据stdout
。