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