使用os.execlp时,为什么`python`需要`python`作为argv[0]

使用os.execlp时,为什么`python`需要`python`作为argv[0],python,linux,unix,operating-system,Python,Linux,Unix,Operating System,代码如下所示: os.execlp('python', 'python', 'child.py', #other args#) # this works os.execlp('python', 'child.py', #other args#) # this doesn't work 我读到这个问题: 但我还是很困惑。答案是: 第一个参数是要执行的程序(位于路径上)。这个 其余是程序的sys.argv参数 但是,如果我运行:python child.py1 2 3,这个过程的sys.ar

代码如下所示:

os.execlp('python', 'python', 'child.py', #other args#)  # this works

os.execlp('python', 'child.py', #other args#)  # this doesn't work
我读到这个问题:

但我还是很困惑。答案是:

第一个参数是要执行的程序(位于路径上)。这个 其余是程序的sys.argv参数


但是,如果我运行:
python child.py1 2 3
,这个过程的
sys.argv
将是
[“child.py”,“1”,“2”,“3”]
,而
python
不存在。那么为什么我要添加
python
作为
os.execlp
的第二个参数呢?

在执行python时,它会为您创建
sys.argv
。该列表中的值基于操作系统传递给它的参数,但它从该列表中删除了
sys.executable

换句话说,当调用Python时,它将
sys.argv
设置为除自身可执行文件之外的所有内容


当您通过
os.execlp()
调用新的可执行文件时,仍然需要在其中包含Python,因为这是操作系统将运行的可执行文件。传递给
os.execlp()
的前两个值仍然是必需的,无论稍后在
sys.argv
中找到什么。

第二个python是python的名称,它可以是任何字符串,但必须存在

参见以下内容的第二段:

各种exec*函数为加载到进程中的新程序获取参数列表。在每种情况下,这些参数中的第一个作为新程序的名称传递给新程序,而不是作为用户在命令行上键入的参数。对于C程序员来说,这是传递给程序main()的argv[0]。例如,os.execv('/bin/echo',['foo','bar'])将只在标准输出上打印条;富似乎会被忽视


我意识到这个问题很久以前就得到了回答,答案基本上是正确的,但在措辞和对答案的评论中,有一些东西是误导性的,我想谈谈

首先,我认为更清楚地说明正在发生什么的方法是强调Unix argv列表和python sys.argv之间的区别,Unix argv列表是由操作系统传递给进程的。python sys.argv是Unix argv列表,其中删除了第一个元素(命令名)

各种os.exec*命令使用它们的第一个参数作为要调用的实际可执行文件,该行的其余部分是Unix argv列表,这意味着传递给execlp的第二个参数将被可执行文件解释为它被调用的命令行名称

这就引出了评论的问题。ls示例os.execlp('ls','.')“起作用”的原因并不是因为ls做了任何特殊的事情来检测它,而调用它的参数太少。此示例代码启动unix argv列表为['.]]的“ls”可执行文件。这仅仅意味着ls可执行文件在被告知(奇怪的是)它被作为“.”调用时启动,并且没有其他命令行参数。当ls在没有其他命令行参数的情况下运行时,它会做什么:它打印当前目录的内容,或者确切地说,当调用os.execlp('ls',')时,人们错误地认为它们正在做什么


通过尝试os.execlp('ls','/some/non-existant/path'),您可以看到这个示例实际上并不“有效”。这也会打印出当前工作目录的内容,不会被误认为是“正在工作”。

您混淆了
sys.argv
execlp
的参数;它们不一定相同。我想知道为什么会有人突然投反对票。@MartijnPieters我投了反对票。。。因为您说过
其余的是程序的sys.argv参数。
。我检查了
sys.argv
,发现
sys.argv[0]
不是
python
操作系统将参数传递给
os.execlp
。Python可以随心所欲地处理这些问题,
sys.argv
不是同一个列表。它是从操作系统传递给它的东西派生出来的,是的,但是不要把两者混为一谈。谢谢,Martjin,我理解。我还尝试了
os.execlp('ls',“)
。为什么它不重复
ls
ls
是特例;当您传入的参数太少时,它会检测;例如,
echo
,它不起作用。引用相关部分将有助于回答这个问题,因为只有链接的答案通常会因为很多原因而不受欢迎,尤其是将来的死URL。