python 分叉进程未使用 os.execlp 执行

python forked processes not executing with os.execlp

我有这个简单的 python 脚本,它应该派生新进程,然后让每个进程使用 os.execlp 执行一个命令,但只执行一次。我很好奇是否存在时间问题导致其他分叉无法执行:

import os

for n in range(5):
    PID = os.fork()
    if PID == 0: #the child...
        print("This child's PID is: %s" % os.getpid())
        os.execlp('open','-n','-a','Calculator')
        # os.popen('open -n -a Calculator')
        # os._exit(0)
    else:
        print("new child forked: %d" % PID)

为此,OSX中的"open -n -a Appname"命令启动了指定应用程序的新实例,所以上面的代码应该用"open"命令替换派生进程,并且这应该 运行 5 次。但是,它仅 运行 一次,因此仅打开了一个计算器实例。尽管如此,父级列出了 5 个分叉的子 PID。

如果我注释掉 os.execlp 行并取消注释后面的 os.popen 和 os._exit 行,那么这会正常工作并且子进程处理所有 运行 "open"命令;但是,我想知道为什么使用 execlp(或 execvp 和其他类似变体)替换分叉进程的方法不起作用?显然子进程是 运行ning,因为我可以使用管道连接到 运行 "open" 命令就好了。

这是 python 3.4.3.

在可执行文件之后的第一个参数是 arg[0],按照惯例这是可执行文件的名称。这很有用,如果你有符号链接,它决定了程序的行为。在你的例子中,你将程序命名为 '-n',真正的参数只有 -aCalculator。所以你必须重复 'open':

os.execlp('open', 'open', '-n', '-a', 'Calculator')