【问题标题】:Why am I getting an "execv(file, args)" error when using execl()?为什么在使用 execl() 时出现“execv(file, args)”错误?
【发布时间】:2020-07-25 01:07:21
【问题描述】:

我正在尝试使用 execl() 执行一个新程序,但它不断返回一个 execv() 错误,指出 arg2 不能为空。

if pid == 0:
    print("This is a child process")
    print("Using exec to another program")
    os.execl("example_prg_02.py")

为什么在使用 execl() 时会出现这种情况? execl() 也需要 args 吗?

【问题讨论】:

  • 试试os.execl("python", "example_prg_02.py")
  • @rdas 也尝试过,但它不起作用。返回同样的错误。
  • execl 只是execv 的包装器,它允许将参数作为单独的可变参数传递,而不是作为单个字符串数组传递。它仍然在做同样的事情,只是使用了不同的调用约定。

标签: python os.execl


【解决方案1】:

"example_prg_02.py"不是可执行文件的路径,你必须指定

  • 可执行文件的路径作为第一个参数,
  • 第二个可执行文件的名称,
  • 参数为第 3 个(第 4 个、第 5 个、...)

所以不是你的

os.execl("example_prg_02.py")

使用

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

(当然,你有第一个 import sys)。

sys.executable 是 Python 解释器的可执行二进制文件的绝对路径。


附录(来自我的评论):

当我使用execl() 时,为什么来自execv() 的错误?

execv()execl() 做同样的事情,它们在命令行参数的传递方式上有所不同:

  • 如果最后一个字母是vv可变数量的参数),你必须为argv提供一个列表或元组(即论据),

  • 如果最后一个字母是 l(这可能意味着 list them — 表示 constant 个),您必须提供 argv 作为单独的参数

execl() 只是一个“语法糖”——它在内部调用 execv(),所以你从execv() 得到了错误。

【讨论】:

  • 太完美了,现在可以使用,对我来说更有意义,谢谢。你知道为什么它会为一个 execl() 函数返回一个 execv() 错误吗?
  • execv()execl() 做同样的事情,它们在命令行参数的传递方式上有所不同:如果最后一个字母是 v(可变数量的参数),您必须为argv(即参数)提供一个列表或元组,如果它是l(这可能意味着列出它们 - 对于它们的恒定数量),您必须提供 argv 作为单独的参数 。 ——execl() 只是一个“语法糖”——它在内部调用了execv(),所以你得到了execv() 错误。
  • “可执行文件的名称作为第二个参数”的目的是什么,因为我们已经有了“可执行文件的路径作为第一个参数”,所以第二个参数可以不同于第一个参数(我意思是指向不同的可执行文件),第二个的用途是什么?
  • @DCdQ,你很聪明,没有人问这个。简短的回答是几乎所有的可执行文件都完全忽略了这个第二个参数(所以你可以为它写 any 字符串,例如"abracadabra")。如果您想了解原因,请将您的评论写为新问题,我会回答。
猜你喜欢
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2021-06-26
  • 2016-07-30
  • 2019-11-02
  • 2015-01-15
  • 1970-01-01
相关资源
最近更新 更多