使用PyInstaller打包含speedtest-cli的Python程序时遇__builtin__模块错误
解决Python3.12打包speedtest-cli桌面应用的报错问题
1. 修复__builtin__模块找不到的问题
__builtin__是Python2的内置模块,Python3中已更名为builtins,直接替换单个文件的引用可能无法覆盖依赖链,试试这两种方案:
- 虚拟模块映射法
在项目根目录新建__builtin__.py文件,写入一行代码:
打包时将这个文件添加到auto-py-to-exe的文件列表中,让打包程序识别这个模块。from builtins import * - 源码补丁法
用pip show speedtest-cli查看库的安装路径,找到核心文件(如speedtest.py),全局替换所有__builtin__为builtins,并确保文件顶部有import builtins语句。
2. 解决AttributeError: 'NoneType' object has no attribute 'fileno'
这个错误是因为GUI程序打包后无控制台环境,speedtest-cli尝试访问标准输入输出的文件描述符时得到None,可以这样处理:
- 重定向标准流
在主程序入口最顶部添加代码:import sys import os # 将空设备作为标准流的替代,避免无控制台报错 if sys.stdin is None: sys.stdin = open(os.devnull, 'r') if sys.stdout is None: sys.stdout = open(os.devnull, 'w') if sys.stderr is None: sys.stderr = open(os.devnull, 'w') - 临时测试控制台模式
在auto-py-to-exe中将"Console Window"改为"Console Based",打包后运行验证。如果正常,说明是无控制台环境导致的流问题,再用上面的重定向代码改回GUI模式。
3. 适配Python3.12的版本兼容处理
Python3.12移除了部分旧语法和模块,可能speedtest-cli版本不兼容:
- 升级到最新版本:
pip install --upgrade speedtest-cli - 如果最新版仍有问题,尝试安装第三方维护的Python3适配版本:
pip install speedtest-cli2
4. 打包时的额外配置
在auto-py-to-exe的"Advanced"选项中,添加以下隐藏导入项:
builtinsspeedtestsys
确保所有依赖模块被正确打包进exe文件。
内容的提问来源于stack exchange,提问作者Kkj Oll
相关产品推荐
相关产品推荐

