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

Roh*_*mar 4 python restart terminate os.execl

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

os.execl(python, python, *sys.argv) 
Run Code Online (Sandbox Code Playgroud)

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

我希望脚本在重新启动时从头开始。这会不会

os.execv(__file__,sys.argv)
Run Code Online (Sandbox Code Playgroud)

做这份工作吗?来自这里的命令和想法。我从 python 帮助/文档中找不到它们之间的区别。有没有办法干净重启?

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

nne*_*neo 7

在底层,他们做同样的事情:他们用一个新进程替换正在运行的进程映像。

和之间的唯一区别是他们争论的方式。期望一个参数列表(第一个应该是可执行文件的名称),而期望一个可变的参数列表。execvexeclexecvexecl

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


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

['python', __file__] + sys.argv[1:]
Run Code Online (Sandbox Code Playgroud)

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

os.execl(sys.executable, 'python', __file__, *sys.argv[1:])
Run Code Online (Sandbox Code Playgroud)

这很好用。确保你没有忽略或默默地捕捉任何错误execl- 如果它无法执行,你最终会“从你离开的地方继续”。