首页 > 解决方案 > 如何在 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 获得相同的解决方案。

标签: 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


推荐阅读