cx_Freeze 不包含子目录中的 .py 文件

Posted

技术标签:

【中文标题】cx_Freeze 不包含子目录中的 .py 文件【英文标题】:cx_Freeze does not include .py files from subdirectories 【发布时间】:2014-03-22 14:52:13 【问题描述】:

我正在使用 Python 3.3、Pyside 和 lxml 等构建程序。 cx_Freeze 的工作就像一个魅力,直到我开始将我的模块分类到子目录中以保持整洁。 cx_Freeze 工作,但报告模块丢失,输出 .exe 文件无法加载,但使用 .py 文件打开程序没有问题。

我的文件夹结构很简单,只有 2 个子文件夹,分别称为解析器和常量。

cx_Freeze 文档允许添加路径变量,但这不会搜索模块。感谢所有帮助。

import sys
from cx_Freeze import setup,Executable

includefiles = ['open.png', 'appicon.png']
includes = []
excludes = ['Tkinter']
packages = ['lxml._elementpath','lxml.etree']
build_exe_options = 'excludes':excludes,'packages':packages,'include_files':includefiles

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name = 'Config-Sheets',
    version = '0.1',
    description = 'Convert system configuration into .XLSX files',
    author = 'ZZZ',
    author_email = 'XXX@YYY.com',
    options = 'build_exe': build_exe_options , 
    executables = [Executable('main.py', base=base)]
)

导致无法运行的 exe。

Missing modules:
...
? parsers.parsercelerra imported from main__main__
? parsers.parserVPLEX imported from main__main__
? parsers.parserrain imported from main__main__

【问题讨论】:

我认为 cx_Freeze 在包含子目录中的文件方面不应该做得这么糟糕。官方源代码中包含一个relative import 的示例(cx_Freeze / cx_Freeze / samples/relimport / )。测试您是否可以重新创建此行为。 目录在哪里?如果是可以导入的包,cx_freeze 应该能找到。 它们只是嵌套在包含 main.py 的文件夹下面一层 【参考方案1】:

您应该能够非常简单地包含您的包:

packages = ['lxml._elementpath','lxml.etree', 'parsers', 'constants']

当然,目录必须包含 __init__.py 才能被视为包。

如果这没有达到预期的效果,那么查看main.py 中使用的导入机制来拉入这些文件将会很有用。如果它正在做的不是简单的import(或from x import)这会给 cx_Freeze 带来问题。

【讨论】:

【参考方案2】:

您应该在setup.py 脚本中包含您的.py 文件。如果文件不是 Python 本身的一部分,则 cx_freeze 需要知道您想要包含这些文件。您应该将额外的.py 文件及其路径添加到includefiles 列表中。例如:

import sys
from cx_Freeze import setup,Executable

includefiles = ['open.png', 'appicon.png', 'parsers\xtra_file1.py','constants\xtra_file2.py']
includes = []
excludes = ['Tkinter']
packages = ['lxml._elementpath','lxml.etree']
build_exe_options = 'excludes':excludes,'packages':packages,'include_files':includefiles

...

希望这会有所帮助。

【讨论】:

这对我不起作用。将文件的路径添加到 includefiles 参数只会导致 .py 文件按原样复制到构建目录中的文件夹中,而不会被编译。

以上是关于cx_Freeze 不包含子目录中的 .py 文件的主要内容,如果未能解决你的问题,请参考以下文章

cx_Freeze 和移动文件

图像目录和cx_Freeze

使用 cx_Freeze 时如何包含图像?

Python cx_Freeze - 一个可执行文件不打开另一个?

Cx_Freeze - 自动包含模块

为啥当我更改我在 python 中使用 cx_freeze 创建的 exe 中的 py 文件夹时它没有改变?