【问题标题】:Invoking g++ via `subprocess.run` in Python causes "exec format error" in executable在 Python 中通过 `subprocess.run` 调用 g++ 会导致可执行文件中出现“exec 格式错误”
【发布时间】:2020-06-13 02:57:03
【问题描述】:

使用 Python 3.7,我正在尝试调用 g++ 来编译和构建 C++ 文件

#!/usr/bin/env python3

import subprocess

if __name__ == '__main__':
    subprocess.run(
        executable="/usr/bin/g++",
        args=["/some/path/source.cpp", "-std=c++17"],
        shell=True
    )

当我运行脚本时,可执行文件会生成。然后我chmod u+x它。但是,当我尝试执行可执行文件时,它会失败并显示:

-bash: ./a.out: cannot execute binary file: Exec format error

我已阅读有关此错误的其他一些帖子,但没有一个适用。由于某种原因,此方法失败,但是当我在终端中本地运行 g++ 时,它按预期工作。

编辑:当我调用file a.out时,输出是

a.out: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped

感谢任何帮助,谢谢!

【问题讨论】:

  • 您不需要chmod +x a.out。它应该已经是可执行的,所以这已经很可疑了。可以查一下吗?
  • 请检查您在终端中运行的g++是否与您在Python子进程中运行的相同,使用type g++
  • 请在运行 Python 之前尝试删除 a.out,以确保您查看的是它生成的文件而不是其他文件。
  • 最后,您的终端和 Python 子进程获取的环境变量可能存在一些差异。所以在终端中运行env > term.txt,在子进程中运行env > subp.txt,然后diff term.txt subp.txt,看看是否存在任何可能影响编译的差异。
  • @MarkSetchell 这似乎很可能是您提出的三个问题之一,但对于最后一个问题,他可能需要在比较之前对env 输出进行排序:diff <(sort term.txt) <(sort subp.txt)

标签: python linux bash shell raspberry-pi


【解决方案1】:

subprocessexecutable 参数很少需要。使用shell=False,它将覆盖args[0] 作为要运行的程序(允许自定义argv[0],对于登录shell)。使用 shell=True(应尽可能避免使用,部分原因是它不会按照您仔细分离的 args 列表的想法做),它取代了隐含的 /bin/sh 调用来运行命令。运行一个命令的标准选项是-c,所以你运行了

/usr/bin/g++ -c /some/path/source.cpp -std=c++17

这确实会产生一个可重定位的文件(,一个.o 文件)。 a.out 不是这样的正常名称,但当包含源的目录不可写时,它可能是一个后备。

【讨论】:

  • 所以,为了澄清,我应该将可执行参数移动到 args 数组的第一个元素,并使用 shell=False?
  • @RichardRobinson:是的:这是正常的,使用它的好方法。
猜你喜欢
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 2012-10-06
  • 2017-08-03
相关资源
最近更新 更多