cx_Freeze不包括库中的所有模块

时间:2018-01-10 01:14:04

标签: python python-3.x cx-freeze

所以我正在尝试使用以下代码编译名为“File.py”的python脚本:

    from cx_Freeze import setup, Executable
    # Define packages needed(not builtin)
    packages = ['scipy' , 'numpy']
    options = {
        'build_exe': {
            'packages': packages,
        },
    }

    setup(name='Monitor',
          version = '0.8',
          description = 'Monitors stuff.',
          options = options,
          executables = [Executable("File.py")])

“File.py”只使用scipy和numpy,我已将其包含在packages变量中。但是,在编译并运行File.exe之后,我收到错误:“ModuleNotFoundError:没有名为'scipy.spatial.ckdtree'的模块”。我使用的是python 3.6和cx_Freeze 6(支持python 3.6)。如何让cx_Freeze包含所有必要的模块?

2 个答案:

答案 0 :(得分:1)

尝试提供库的实际地址。因此,找到scipy和numpy文件的位置以及包中的内容,包括以下内容:r"C:\Users\yourname\AppData\Local\Programs\Python\Python36\DLLs\tcl86t.dll", r"C:\Users\yourname\AppData\Local\Programs\Python\Python36\DLLs\tk86t.dll",

答案 1 :(得分:0)

可能已经死了,但我会投入我的两分钱,这些年来,scipy 与 cx_Freeze 结合遇到了一些这样的问题。我无法在 SO 上找到有关此问题的文档。

首先,当您运行 File.exe 时,请在出现错误时检查对话框中的完整堆栈跟踪。 ModuleNotFoundError 是您的症状,但根本原因在于哪个文件正在尝试加载模块,通常是 scipy 中某处的 __init__.py 文件。

其次,转到该文件并将正在加载的模块名称与包名称和别名进行比较。您正在寻找模块名称或模块路径方面的差异。例如,我遇到的一个 ckdtree 加载问题是 __init__.py 试图加载 'ckdtree',但分发中的模块是 'cKDTree' 或者有一个大写字母,而不应该是一个。更改尝试加载模块的文件中的大小写可解决此问题。