有没有办法将控制台的STDIN / STDOUT连接到已经运行的进程?
使用案例:
我有一个python脚本,它使用popen在命令行上运行另一个python脚本.
假设foo.py运行popen来运行python bar.py.
然后输入bar.py块.我可以得到python bar.py的PID.有没有办法将新的控制台附加到正在运行的python实例,以便能够以交互方式工作?这特别有用,因为我想在bar.py中运行pdb.
解决方法:
没门.但是你可以修改你启动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.也许这会解决你的问题.