【问题标题】:What is the usage of 2nd parameter in os.execl()os.execl() 中第二个参数的用途是什么
【发布时间】: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")

第二个参数对我来说似乎是多余的,谁能帮忙解释一下为什么我们需要这个参数?

【问题讨论】:

    标签: python linux


    【解决方案1】:

    在过去没有图形显示器和鼠标的好日子里,纯文本控制台(甚至电传打字机)是用户和操作系统之间唯一的用户界面。

    这个界面(命令行界面,CLI)而不是现在的 GUI(图形用户界面)强制用户编写命令,包括用于启动可执行文件的命令,而不是单击它们的图标。

    (目前大多数操作系统仍然有这种可能性,例如 Windows 中的命令行窗口或 PowerShell,或 GNU/Linux 中的控制台/终端窗口。)

    启动程序的命令行有/有一个表单

                  program  argument1  argument2 ...
    

    其中program(在过去只有“程序”和“程序员”,没有“应用程序”和“开发人员”)是可执行文件的名称,通常包括相对/绝对路径。

    操作系统启动program,传递给它不仅参数argument1argument2,...),但 - 所谓的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 本身的角度来看(我们不感兴趣)参数是:

    • 第 0th 参数是字符串"python"
    • 第一个st参数是字符串"/somefolder/somescript.py"
    • 第二个nd 参数是字符串"xxx"
    • 第三个rd参数是字符串"7"

    但从somescript.py 的角度来看——即你的脚本将获得什么——参数是

    • 第 0th 参数是字符串 "/somefolder/somescript.py" — 它在 sys.argv[0]
    • 第一个st参数是字符串"xxx"——它在sys.argv[1]
    • 第二个nd 参数是字符串"7" — 它在sys.argv[2] 中。

    【讨论】:

      【解决方案2】:

      按照惯例,运行程序的第一个参数是用户输入的程序名称​​。它不一定是实际的可执行文件名,通常也不是,例如当文件位于 $PATH 中时。

      大多数 shell 都遵循该约定,但未在 API 级别强制执行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-29
        • 2017-05-02
        • 1970-01-01
        • 2012-05-04
        • 2016-03-25
        • 1970-01-01
        • 2011-10-22
        • 2023-04-07
        相关资源
        最近更新 更多