【问题标题】:I'm having trouble running os.execl() with python 3我在使用 python 3 运行 os.execl() 时遇到问题
【发布时间】:2025-12-03 04:25:01
【问题描述】:
import os
import sys

pid = os.fork()
print ("second test")
if pid == 0:
    print ("this is the child")
    print ("I'm going to exec another program now")
    os.execl("python", "test.py", * sys.argv)
else:
    print ("the child is pid %d" % pid)
    os.wait()

我到处查看示例,但对于我的生活,我就是无法理解它。我认为这会起作用,但我收到了这个错误:

Traceback (most recent call last):
  File "main.py", line 9, in <module>
    os.execl("python", "test.py", * sys.argv)
  File "/usr/local/lib/python3.8/os.py", line 534, in execl
    execv(file, args)
FileNotFoundError: [Errno 2] No such file or directory

【问题讨论】:

  • execl 不进行路径查找。
  • 除非这只是一个简化的示例,否则如果您要在子进程中调用 execl,请改用 subprocess

标签: python python-3.x exec


【解决方案1】:

os.execl() 的第一个参数应该是您要运行的可执行文件的路径。它不会使用$PATH 搜索它。

您还需要将程序名称重复为arg0

os.execl('/usr/local/bin/python', 'python', "test.py", *sys.argv)

您可以使用os.execlp() 使用$PATH 自动查找程序。

os.execlp('python', 'python', "test.py", *sys.argv)

顺便说一句,sys.argv[0] 将是原始 Python 脚本的名称。在将参数传递给另一个脚本时,您可能希望删除它,因此您可以使用 *sys.argv[1:]

当然,大多数人使用subprocess 模块来执行其他程序,而不是直接使用forkexec。这提供了更高级别的抽象来实现 I/O 重定向、等待子进程等。

【讨论】: