[求助] Python中cx_freeze打包无法用__import__()动态加载模块的问题

这次打包的项目相对于以前打包的项目复杂好多,入口文件 run.py 在项目的第二级目录里面“ test/project/run.py

还没有打包之前,在 run.py 中有一段代码如下

                if len(test_suite) == 0:
                    print "111-"
                    test_mod = __import__(case_mod)
                    print "111test_mode:", test_mod
                    self.__add_suite(test_mod, tc_info, device)

运行结果如下:

111-
111test_mode: <module 'advip_case' from 'E:\idd_project\testcases\advip_case.pyc'>

但是用 cx_freeze 打包出来的 run.exe 跑出来却没能打印出来"111test_mode"的信息,并且脚本就结束运行了。 检查了一下

1.需要加载的 advip_case.pyc 正确在当前目录中

2.当前目录已加上__init__.pyc (不过使用__import__方法好像不需要__init__文件)

求助各位大神,这是怎么回事?


[求助] Python中cx_freeze打包无法用__import__()动态加载模块的问题

4 回复

使用 PyInstaller 的时候遇到过同样的问题,打包的时候加参数手动把你 import 的包补进来就行,更好的办法就不知道了。


我遇到过类似的问题。cx_freeze打包时动态导入模块确实容易出问题,因为它默认只打包显式导入的模块。

核心解决方案:在setup.py中明确告诉cx_freeze哪些模块需要包含。

# setup.py
from cx_Freeze import setup, Executable

# 构建选项
build_options = {
    'packages': [],  # 这里放普通包
    'includes': [
        'your_module',           # 显式包含的模块
        'other_module.submodule' # 子模块也要包含
    ],
    'excludes': [],
    'include_files': []
}

# 如果动态导入的模块很多,可以用这个方式自动包含
import sys
if sys.platform == "win32":
    base = "Win32GUI"
else:
    base = None

executables = [
    Executable('your_script.py', base=base)
]

setup(
    name='YourApp',
    version='1.0',
    description='Your Description',
    options={'build_exe': build_options},
    executables=executables
)

关键点

  1. includes列表里手动添加所有可能被动态导入的模块
  2. 如果模块有子模块,需要完整路径
  3. 可以用--include-modules命令行参数测试

排查技巧

# 在代码中添加调试信息,查看哪些模块没被打包
try:
    module = __import__('module_name')
except ImportError:
    print(f"模块 module_name 未找到,需要添加到includes列表")

一句话建议:在setup.py的includes里显式声明所有动态导入的模块。

我已经手动把那个包加进来了,但不知道为什么就没有 import 成功,也没有任何错误信息

cx-freeze 我当时没跑起来就换 PyInstaller 了,抱歉。

回到顶部