如何配置PyInstaller以模块模式打包Python代码解决导入错误?
解决PyInstaller打包模块式启动的相对导入问题
用PyInstaller实现模块式启动的方法
方法1:新增启动引导脚本
创建一个bootstrap.py文件,模拟python -m server.app的启动逻辑:
import sys import runpy # 调整参数,让runpy以模块方式执行目标代码 sys.argv[0] = '-m' runpy.run_module('server.app', run_name='__main__', alter_sys=True)
然后用这个引导脚本来打包:
pyinstaller --onefile bootstrap.py --name "My-app-name"
打包后的exe运行时,会自动以模块方式加载server.app,相对导入逻辑正常生效,命令行参数也能正确传递给服务器程序。
方法2:修改PyInstaller spec文件(进阶)
- 先生成默认spec文件:
pyinstaller --onefile server/app.py --name "My-app-name" --specpath .
- 打开生成的
My-app-name.spec,在EXE代码块前添加逻辑调整运行方式:
import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 保留原有Analysis配置,在EXE块中注入模块启动代码 exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='My-app-name', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True, # 注入模块启动逻辑 code=''' import sys import runpy sys.argv[0] = '-m' runpy.run_module('server.app', run_name='__main__', alter_sys=True) ''', )
最后用spec文件完成打包:
pyinstaller My-app-name.spec
替代打包工具推荐
cx_Freeze
直接支持以模块为入口打包,无需额外引导脚本。创建setup.py:
from cx_Freeze import setup, Executable setup( name="My-app-name", version="1.0", executables=[Executable(module_name="server.app")] )
执行打包命令:
cxfreeze --setup-script setup.py
生成的程序会自动以python -m server.app的方式启动,完美适配相对导入逻辑。
PyOxidizer
现代打包工具,配置文件中直接指定模块启动逻辑:
创建pyoxidizer.toml,关键配置如下:
[[python_executable]] name = "My-app-name" run_module = "server.app"
执行打包:
pyoxidizer build
工具会自动处理模块导入环境,相对导入和命令行参数均能正常工作。
内容的提问来源于stack exchange,提问作者Jan Dolejsi
相关产品推荐
相关产品推荐

