python - 如何在 Python 中实现 Perl 的 exec 功能?
问题描述
假设使用 Linux:
在 Perl 中,该exec
函数执行一个外部程序并立即退出,将外部程序留在同一个 shell 会话中。
使用 Python 的一个非常接近的答案是https://stackoverflow.com/a/13256908
但是,Python 解决start_new_session=True
方案使用 setsid 方法启动外部程序,这意味着该解决方案适用于制作守护程序,而不是交互式程序。
下面是一个使用 perl 的简单示例:
perl -e '$para=qq(-X --cmd ":vsp");exec "vim $para"'
vim 启动后,原来的 Perl 程序已经退出,vim 仍然在同一个 shell 会话中(vim 没有被发送到新的会话组)。
如何使用 Python 获得相同的解决方案。
解决方案
Perl 只是在这里包装exec*
系统调用函数。Python 具有相同的包装器,在os
模块中,请参阅os.exec*
文档:
这些函数都执行一个新程序,替换当前进程;他们不回来。在 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 进程的一个分支替换为您想要运行的命令subprocess
。