Python3.7 subprocess.Popen在一台Buster系统树莓派上报[Errno 2] No such file or directory
问题根因定位及解决方案
这个报错除了目标文件路径不存在的场景外,还包含内核无法成功加载执行目标二进制文件的情况,针对同系统不同代树莓派的场景,按以下优先级排查修复:
1. 验证目标二进制的架构兼容性
这是不同代树莓派同系统下最常见的触发原因:
- 旧款树莓派(如Pi Zero、初代Pi)采用
armv6l架构,新款树莓派(如Pi 3/4)采用armv7l/aarch64架构 - 如果你要调用的二进制是针对armv7/aarch64编译的,在armv6架构的设备上运行时,系统会直接抛出
No such file or directory错误,和文件不存在的报错完全一致 - 验证方式:在报错的树莓派上直接执行二进制全路径,比如
/usr/bin/你的目标命令,如果终端返回-bash: /usr/bin/你的目标命令: No such file or directory,即可确定是架构不兼容问题 - 修复方案:重新编译目标二进制适配当前设备的armv6架构,或者安装对应架构的官方软件包
2. 检查动态链接依赖缺失
如果架构匹配,接下来排查动态库依赖:
- 执行
ldd 你的目标命令全路径,检查输出中是否有标记为not found的依赖库 - 比如部分软件编译时依赖的glibc版本高于Buster自带的版本,也会触发同类报错
- 修复方案:安装缺失的依赖库,或者重新编译二进制适配当前系统的库版本
3. 修正subprocess调用写法
你禁用了shell=True,此时字符串格式的命令参数本身就无法被解析,必须用列表格式传参,正确写法示例:
import subprocess # 正确:列表格式,第一个元素是命令全路径,后续元素为独立参数 p = subprocess.Popen(['/usr/bin/你的目标命令', '参数1', '参数2']) # 错误:字符串格式,shell=False时无法解析空格分隔的参数 p = subprocess.Popen('/usr/bin/你的目标命令 参数1 参数2')
内容的提问来源于stack exchange,提问作者bitrat
相关产品推荐
相关产品推荐

