假设使用Linux:
在Perl中,exec
function执行外部程序并立即退出,将外部程序保留在同一个shell会话中。
使用Python的一个非常接近的答案是https://stackoverflow.com/a/13256908
但是,使用start_new_session=True
的Python解决方案使用setsid方法启动外部程序,这意味着该解决方案适用于制作守护程序,而不是交互式程序。
以下是使用perl的简单示例:
perl -e '$para=qq(-X --cmd ":vsp");exec "vim $para"'
启动vim后,原来的Perl程序退出,vim仍在同一个shell会话中(vim不会发送到新的会话组)。
如何使用Python获得相同的解决方案。
答案 0 :(得分:5)
Perl只是将exec*
system call functions包裹在这里。 Python具有相同的包装器,在os
模块中,请参阅os.exec*
documentation:
这些函数都执行一个新程序,取代当前进程;他们不回来。在Unix上,新的可执行文件被加载到当前进程中,并且将具有与调用者相同的进程ID。
在Python中做同样的事情:
python -c 'import os; para="-X --cmd \":vsp\"".split(); os.execlp("vim", *para)'
os.execlp
接受一个参数列表,并从第一个参数中查找$PATH
中的二进制文件。
subprocess
模块仅适用于将进程接下来运行到Python进程,而不是替换Python进程。在POSIX系统上,subprocess
模块使用低级exec*
函数来实现它的功能,其中Python进程的 fork 随后被替换为命令您希望与subprocess
一起运行。