【发布时间】:2020-12-22 03:59:39
【问题描述】:
这个问题的灵感来自Why am I getting an “execv(file, args)” error when using execl()?中的cmets。
当我们使用
os.execl(sys.executable, "python", "script.py")
第二个参数对我来说似乎是多余的,谁能帮忙解释一下为什么我们需要这个参数?
【问题讨论】:
这个问题的灵感来自Why am I getting an “execv(file, args)” error when using execl()?中的cmets。
当我们使用
os.execl(sys.executable, "python", "script.py")
第二个参数对我来说似乎是多余的,谁能帮忙解释一下为什么我们需要这个参数?
【问题讨论】:
在过去没有图形显示器和鼠标的好日子里,纯文本控制台(甚至电传打字机)是用户和操作系统之间唯一的用户界面。
这个界面(命令行界面,CLI)而不是现在的 GUI(图形用户界面)强制用户编写命令,包括用于启动可执行文件的命令,而不是单击它们的图标。
(目前大多数操作系统仍然有这种可能性,例如 Windows 中的命令行窗口或 PowerShell,或 GNU/Linux 中的控制台/终端窗口。)
启动程序的命令行有/有一个表单
program argument1 argument2 ...
其中program(在过去只有“程序”和“程序员”,没有“应用程序”和“开发人员”)是可执行文件的名称,通常包括相对/绝对路径。
操作系统启动program,传递给它不仅参数(argument1,argument2,...),但 - 所谓的0th 参数 — program 本身也是。
(以与输入相同的形式,即有或没有路径,有或没有后缀/扩展名。)
所以启动的程序可能会发现,如何它是启动的。它可能会将此信息用于各种目的,例如
禁止使用其他名称 ("nomen est omen") 启动它 — 所以如果你重命名了一个可执行文件,那么你运气不好,
根据启动名称达到不同的行为(某些可执行文件是/安装有不同名称的软链接),
如果在命令中明确使用,则用于从路径中获取帮助程序/用户文件的位置。
许多当代程序(哦,不,应用程序)仍然利用从 CLI 带参数启动它们的可能性,但(大部分)忽略程序的名称。
例如,在 Windows 中,您可以使用命令
notepad somename.txt
使用已打开的somename.txt 文件启动记事本。或者——为了不走远——Python 可能会使用命令启动你的脚本
python somescript.py
回到主要问题:
os.execl() 函数模仿从 CLI 启动应用程序的行为,使(此函数的)用户可以根据需要指定 program。它是os.execl() 函数的第二个参数。正如我所提到的,一些(主要是旧的)程序的行为取决于它。
附录:
Python 在其sys.argv 中列出了所有命令行参数——包括其sys.argv[0] 元素中的第 0th 参数。
但请注意——如果您使用命令启动脚本
python /somefolder/somescript.py xxx 7
从python 本身的角度来看(我们不感兴趣)参数是:
"python","/somefolder/somescript.py","xxx","7",但从somescript.py 的角度来看——即你的脚本将获得什么——参数是
"/somefolder/somescript.py" — 它在 sys.argv[0],"xxx"——它在sys.argv[1],"7" — 它在sys.argv[2] 中。【讨论】:
按照惯例,运行程序的第一个参数是用户输入的程序名称。它不一定是实际的可执行文件名,通常也不是,例如当文件位于 $PATH 中时。
大多数 shell 都遵循该约定,但未在 API 级别强制执行。
【讨论】: