10

代码是这样的:

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

os.execlp('python', 'child.py', #other args#)  # this doesn't work

我读了这个问题:execlp() in python

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

第一个参数是要执行的程序(在 PATH 上找到)。其余的是程序的 sys.argv 参数。

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

4

3 回答 3

11

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

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

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

于 2013-01-05T17:30:06.070 回答
6

第二个python是python的一个名字,它可以是任何字符串,但它必须在那里。

请参阅http://docs.python.org/3/library/os.html?highlight=os.exec#process-management第二段

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

于 2013-08-31T19:45:47.670 回答
1

我意识到这是很久以前回答的,而且答案基本上是正确的,但是在措辞方式和我想解决的答案的评论中,有一些事情是误导性的。

首先,我认为更清楚地说明正在发生的事情的方法是强调区别在于操作系统传递给进程的 Unix argv 列表和 python sys.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') 来看到这个示例确实没有“工作”。这也会打印出当前工作目录的内容,不会被误认为是“工作”。

于 2020-10-30T17:32:14.713 回答