调用g++;通过Python中的'subprocess.run`causes";exec格式错误";可执行 使用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 )

调用g++;通过Python中的'subprocess.run`causes";exec格式错误";可执行 使用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 ),python,linux,bash,shell,raspberry-pi,Python,Linux,Bash,Shell,Raspberry Pi,当我运行脚本时,可执行文件将生成。然后我chmodu+xit。但是,当我尝试执行可执行文件时,它失败并显示: -bash: ./a.out: cannot execute binary file: Exec format error 我读过一些关于这个错误的帖子,但是没有一篇是适用的。由于某些原因,此方法失败,但是当我在终端中以本机方式运行g++时,它会按预期工作 编辑:当我调用文件a.out时,输出为 a.out: ELF 32-bit LSB relocatable, ARM, EABI5

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

-bash: ./a.out: cannot execute binary file: Exec format error
我读过一些关于这个错误的帖子,但是没有一篇是适用的。由于某些原因,此方法失败,但是当我在终端中以本机方式运行
g++
时,它会按预期工作

编辑:当我调用
文件a.out
时,输出为

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

谢谢你的帮助,谢谢

很少需要
子流程的
可执行文件
参数。使用
shell=False
,它将覆盖
args[0]
作为要运行的程序(允许自定义
argv[0]
作为登录shel)。使用
shell=True
(在可能的情况下应该避免,部分原因是它不会按照您仔细分离的
args
列表所想的那样执行),它将替换运行命令时调用的隐式
/bin/sh
。运行一个命令的标准选项是
-c
,因此您运行了

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

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

您不需要
chmod+x a.out
。它应该已经是可执行的,所以这已经是可疑的了。您可以检查吗?请检查您在终端中运行的
g++
是否与在Python子流程中运行的相同,使用
键入g++
请在运行Python之前尝试删除
a.out
,以确保您查看的是它生成的文件,而不是其他文件。最后,在终端和Python子流程之间,环境变量可能存在一些差异。因此,在终端中运行
env>term.txt
,在子流程中运行
env>subp.txt
,然后运行
diff term.txt subp.txt
,查看是否存在任何可能影响编译的差异。@MarkSetchell这似乎很可能是您提出的三个问题之一,但是对于最后一个,他可能需要在比较之前对
env
输出进行排序:
diff因此,为了澄清,我应该将可执行参数移动到args数组的第一个元素,并使用shell=False?@RichardRobinson:是的:这是正常的、好的使用方法。