python 中 os.execl() 和 os.execv() 的区别

Difference between os.execl() and os.execv() in python

python中的os.execl()和os.execv()有区别吗?我正在使用

os.execl(python, python, *sys.argv) 

重新启动我的脚本(来自 here)。但它似乎是从上一个脚本离开的地方开始的。

我希望脚本在重新启动时从头开始。请问这个

os.execv(__file__,sys.argv)

做这份工作? command and idea from here. 我找不到它们与 python help/documentation 之间的区别。有没有办法干净重启?

有关我正在尝试做的事情的更多背景信息,请参阅

根据 Python documentation execvexecl 之间没有真正的功能区别:

The “l” and “v” variants of the exec* functions differ in how command-line arguments are passed. The “l” variants are perhaps the easiest to work with if the number of parameters is fixed when the code is written; the individual parameters simply become additional parameters to the execl*() functions. The “v” variants are good when the number of parameters is variable, with the arguments being passed in a list or tuple as the args parameter. In either case, the arguments to the child process should start with the name of the command being run, but this is not enforced.

不知道为什么有人似乎在脚本停止的地方重新启动脚本,但我猜这是不相关的。

在低级别他们做同样的事情:他们用新进程替换 运行 进程映像。

execvexecl 之间的 区别在于他们接受参数的方式。 execv 需要一个参数列表(第一个参数应该是可执行文件的名称),而 execl 需要一个可变参数列表。

因此,在本质上,execv(file, args) 完全等同于 execl(file, *args)


请注意,sys.argv[0] 已经是脚本名称。但是,这是传递给 Python 的脚本名称,可能不是程序在 运行 下的实际脚本名称。为了正确和安全,传递给 exec* 的参数列表应该是

['python', __file__] + sys.argv[1:]

我刚刚使用以下内容测试了重启脚本:

os.execl(sys.executable, 'python', __file__, *sys.argv[1:])

这很好用。确保你没有忽略或默默地捕获来自 execl 的任何错误 - 如果它无法执行,你将最终 "continuing where you left off".