You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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文件(进阶)

  1. 先生成默认spec文件:
pyinstaller --onefile server/app.py --name "My-app-name" --specpath .
  1. 打开生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 10:33:29