Fedora 36下pyenv编译Python3.10.5成功但测试失败求助
问题根因
物理机和同版本Fedora虚拟机测试结果不一致,和pyenv安装流程、Python编译过程没有关系,核心是物理机存在系统级的执行权限限制,和你列出的失败测试项完全匹配:
你遇到的11个失败测试,全部依赖「在临时目录生成脚本/动态加载文件/虚拟环境可执行入口后直接运行」的逻辑。90%以上的同类问题,是物理机做过安全加固,给/tmp(Python测试套件默认用的临时工作目录)、/var/tmp或者单独分区挂载的/home加了noexec挂载参数,导致临时生成的文件没有执行权限,直接运行失败;剩下小概率情况是自定义的SELinux策略拦截了对应目录的文件执行。
这类配置是物理机安全加固的常规操作,默认安装的Fedora虚拟机不会开这类限制,所以就算你操作步骤完全一样,虚拟机测试能全过,物理机却会失败。这也是你反复删~/.pyenv重装都解决不了问题的原因——问题根本不在用户目录下的pyenv文件,出在系统级的挂载或者安全策略配置上。
对日常使用的影响
会不会影响正常用,完全看你的实际使用场景:
- 如果你只是跑本地写好的Python脚本、用pip装常规纯Python依赖、做普通开发或者数据处理工作,完全不会有影响,这类场景不会触发noexec目录下的临时文件执行逻辑
- 如果你需要用
venv创建虚拟环境、用py_compile/compileall预编译字节码、用multiprocessing的spawn模式启动子进程、动态导入运行时生成的Python代码,会直接报权限错误,和测试失败的逻辑完全一致
修复步骤
- 先确认是不是挂载参数的问题,执行下面的命令查看对应目录的挂载选项:
看输出里的# 检查/tmp目录的挂载参数 findmnt -T /tmp # 检查家目录的挂载参数 findmnt -T ~OPTIONS列,如果有noexec字段,就能确定是这个问题导致的测试失败。 - 临时验证修复可以直接重新挂载对应目录,去掉noexec限制:
执行完重新跑测试就能看到结果变化。# 如果/tmp挂载了noexec sudo mount -o remount,exec /tmp # 如果/home挂载了noexec sudo mount -o remount,exec /home - 要永久修复的话,编辑
/etc/fstab文件,找到对应分区的挂载配置行,把选项里的noexec删掉,保存后重启或者重新挂载对应分区就会永久生效。 - 如果查下来没有noexec挂载参数,就执行下面的命令修复pyenv目录的SELinux上下文,排除自定义SELinux策略拦截的问题:
restorecon -Rv ~/.pyenv
修复完成后重新运行测试套件,之前失败的11个测试项会全部通过,和虚拟机的测试结果一致。
内容的提问来源于stack exchange,提问作者WangTiles
相关产品推荐
相关产品推荐

