Python os.execl()中第二个参数的用法是什么

Python os.execl()中第二个参数的用法是什么,python,linux,Python,Linux,这个问题是从中的评论中得到启发的 当我们使用 os.execl(sys.executable, "python", "script.py") 第二个参数对我来说似乎是多余的,有人能解释一下为什么我们需要这个参数吗?根据惯例,运行程序的第一个参数是用户输入的程序名。它不必是实际的可执行文件名,通常不是,例如,当文件位于$PATH中时 大多数shell都遵循这一约定,但在API级别上没有强制执行。在没有图形监视器和鼠标的旧时代,纯文本控制台(甚至电传打字机)

这个问题是从中的评论中得到启发的

当我们使用

os.execl(sys.executable, "python", "script.py")

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

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


大多数shell都遵循这一约定,但在API级别上没有强制执行。

在没有图形监视器和鼠标的旧时代,纯文本控制台(甚至电传打字机)是用户和操作系统之间唯一的用户界面

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

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

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

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

操作系统启动了
程序
,不仅将参数(
argument1
argument2
,…)传递给它,而且将-作为所谓的第0个参数
程序本身也传递给它。
(与键入的格式相同,即有或没有路径,有或没有后缀/扩展名。)

因此,启动的程序可能会发现,它是如何启动的。它可能将此信息用于各种目的,例如

  • 禁止使用另一个名称()启动它-因此,如果重命名了可执行文件,则会带来厄运

  • 为了达到与启动名称相关的不同行为(某些可执行文件安装了具有不同名称的软链接)

  • 用于从路径导出帮助器/用户文件的位置(如果在命令中显式使用)

许多当代程序(哦,不,应用程序)仍然可以利用带有参数的CLI启动它们,但是(大部分)忽略了程序的名称

例如,在Windows中,您可以使用以下命令

       notepad somename.txt
       python somescript.py
python  /somefolder/somescript.py  xxx  7
使用已打开的
somename.txt
文件启动记事本。或者,为了不走得太远,Python可以使用以下命令启动脚本

       notepad somename.txt
       python somescript.py
python  /somefolder/somescript.py  xxx  7
回到主要问题:

os.execl()
函数模拟从CLI启动应用程序的行为,允许(此函数的)用户根据需要指定
程序。它是
os.execl()
函数的第二个参数。正如我提到的,一些(主要是旧的)程序的行为依赖于它


增编:

Python在其
sys.argv
中列出了所有命令行参数,包括其
sys.argv[0]
元素中的第0个参数

但是请注意,如果您使用命令启动脚本

       notepad somename.txt
       python somescript.py
python  /somefolder/somescript.py  xxx  7
python
本身的角度来看(我们对此不感兴趣),参数如下:

  • 第0个参数是字符串
    “python”
  • 第一个参数是字符串
    “/somefolder/somescript.py”
  • 第二个参数是字符串
    “xxx”
  • 第三个参数是字符串
    “7”
但是从
somescript.py
的角度来看,即脚本将获得什么,参数是

  • 第0个参数是字符串
    “/somefolder/somescript.py”
    -它位于
    sys.argv[0]
  • 第一个参数是字符串
    “xxx”
    -它位于
    sys.argv[1]
  • 第二个参数是字符串
    “7”
    ——它位于
    sys.argv[2]