Linux(Fedora27)下Python3.6.5用freeze.py打包遇_sysconfigdata错误
我之前在Fedora环境下用自带的freeze.py打包自定义编译的Python 3.6.x应用时,也碰到过一模一样的_sysconfigdata问题,给你几个亲测有效的解决思路:
1. 手动指定_sysconfigdata模块路径
freeze.py对Python 3.6+新增的_sysconfigdata模块支持不完善,没法自动识别自定义编译Python里的这个文件。你先去你的LOCAL_PYTHON目录下,找到类似lib/python3.6/_sysconfigdata_m_linux_x86_64-linux-gnu.py的文件(文件名可能因系统架构略有差异),然后修改打包命令,手动把这个模块加入打包列表:
LOCAL_PYTHON=(本地编译Python目录路径) $LOCAL_PYTHON/python $LOCAL_PYTHON/Tools/freeze/freeze.py -p $LOCAL_PYTHON -P $LOCAL_PYTHON -m _sysconfigdata_m_linux_x86_64-linux-gnu -o frozen myapp.py
注意把_sysconfigdata_m_linux_x86_64-linux-gnu换成你实际找到的模块名。
2. 重新编译Python(确保配置正确)
如果你的Python编译时用了自定义prefix或特殊编译选项,可能导致_sysconfigdata的路径不被freeze.py识别。可以用最简配置重新编译一次:
cd /path/to/python-3.6.5-source ./configure --prefix=/path/to/your/local/python make && make install
编译完成后再重新执行打包命令,大概率能解决路径识别问题。
3. 手动复制_sysconfigdata文件到打包目录
如果上面两种方法都没效果,你可以直接把找到的_sysconfigdata_*.py文件复制到freeze生成的frozen目录下,再重新运行打包命令,或者把这个文件放到最终生成的myapp可执行文件同目录下——这样程序运行时就能找到需要的配置数据了。
问题根源补充
Python 3.6开始引入了_sysconfigdata模块来统一存储系统编译配置信息,但自带的freeze.py工具更新滞后,对自定义编译的Python环境自动探测能力不足,所以需要我们手动干预来确保这个关键模块被正确打包进去。
内容的提问来源于stack exchange,提问作者benjamin.hammond

