python中的C风格exec

python中的C风格exec,python,Python,在bash或C中,exec将终止当前进程并将其替换为新进程。这个功能可以用Python实现吗?我不希望简单地执行一些代码,然后继续运行python脚本(甚至只是为了立即退出),或者生成一个子进程 我的具体情况如下。我正在开发一个命令行应用程序(python+curses),用于在科学计算环境中管理数据生成/分析。有时,我需要终止应用程序并手动处理给定子目录中的数据。如果我能做一些像这样的事情,我会很方便: # within python script; d=<some directory&

在bash或C中,
exec
将终止当前进程并将其替换为新进程。这个功能可以用Python实现吗?我不希望简单地执行一些代码,然后继续运行python脚本(甚至只是为了立即退出),或者生成一个子进程

我的具体情况如下。我正在开发一个命令行应用程序(python+curses),用于在科学计算环境中管理数据生成/分析。有时,我需要终止应用程序并手动处理给定子目录中的数据。如果我能做一些像这样的事情,我会很方便:

# within python script; d=<some directory>
if exit_and_goto_dir:
    exec("pushd {}".format(d)) # C-style exec -- terminate program and execute new command

这种行为并不十分重要。有很多解决方法(例如,将我关心的目录打印到终端,然后手动打印cd)。我很好奇这是否可能。谢谢

os模块包含C标准库中各种
exec*
函数的Python包装:

>>> [method for method in dir(os) if method.startswith("exec")]
['execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe']
但是,
pushd
不是一个可以执行的可执行文件,而是一个
bash
内置文件(对于
cd
也是如此)

您可以做的是更改python进程内的目录,然后执行一个交互式shell:

import os
os.chdir(d)
os.execvp("bash", ["bash", "-login"])
Python的当前目录将由您执行的shell继承。稍后退出该shell时,控件将返回到调用python的原始登录shell(除非首先使用该shell的
exec
命令启动python)


您不能做的是从python内部修改调用shell的当前目录,以便返回shell提示符,但在调用python时的不同工作目录中。(至少没有直截了当的方法。有一种方法涉及将gdb附加到它,如前所述,但在我在Ubuntu上试用时,它只能作为根目录使用。)

操作系统模块包含用于C标准库中各种
exec*
函数的Python包装:

>>> [method for method in dir(os) if method.startswith("exec")]
['execl', 'execle', 'execlp', 'execlpe', 'execv', 'execve', 'execvp', 'execvpe']
但是,
pushd
不是一个可以执行的可执行文件,而是一个
bash
内置文件(对于
cd
也是如此)

您可以做的是更改python进程内的目录,然后执行一个交互式shell:

import os
os.chdir(d)
os.execvp("bash", ["bash", "-login"])
Python的当前目录将由您执行的shell继承。稍后退出该shell时,控件将返回到调用python的原始登录shell(除非首先使用该shell的
exec
命令启动python)


您不能做的是从python内部修改调用shell的当前目录,以便返回shell提示符,但在调用python时的不同工作目录中。(至少没有直截了当的方法。有一种方法涉及将gdb附加到它,如前所述,但在我在Ubuntu上试用时,它只能作为根目录使用。)

Python的
os
模块中提供了C的
exec()
的几种变体。你不能
exec
pushd
-它是shell的一部分,不是一个程序。您可以
exec
shell(在您自己的
chdir
之后),但这仍然会让用户的shell运行,这可能会令人困惑。Python的
os
模块中提供了C的
exec()
的几种变体。您不能
exec
pushd
-它是shell的一部分,不是一个程序。您可以
exec
shell(在您自己的
chdir
之后),但这仍然会让用户的shell运行,这可能会让人感到困惑。