cx_freeze:如何将包文件添加到 library.zip 中?

Posted

技术标签:

【中文标题】cx_freeze:如何将包文件添加到 library.zip 中?【英文标题】:cx_freeze: How do I add package files into library.zip? 【发布时间】:2012-05-23 07:56:01 【问题描述】:

当我尝试为 Windows 滚动 zip 时,我注意到 pytz 错过了 zoneinfo 文件夹。现在我有一个在python setup.py build 之后使用的解决方法,即

7z a -xr!*.py* build\exe.win32-2.7\library.zip C:\Python27\Lib\site-packages\pytz

有没有适当的方法可以从setup.py 或其他地方实现这一目标?

【问题讨论】:

您可以尝试使用 zip-includes 选项。文档:cx_freeze.readthedocs.org/en/latest/distutils.html 此选项用于在我构建文件时将文件添加到最终 ZIP 中。就我而言,我说的是 library.zip,而不是重新分发的最终 ZIP。如果我尝试您的建议,我会收到error: error in setup script: command 'build_exe' has no such option 'zip-includes'。通常使用 packages 选项在其中包含代码,但 pytz 只有数据文件,如果我尝试添加“包”pytz/zoneinfo,此选项会失败. 尝试将其命名为zip_includes,distutils 对破折号/下划线可能很有趣。我认为 'zip-includes' 是在谈论 library.zip - cx_Freeze 不会自动压缩所有内容以进行分发,尽管您当然可以自己执行此操作。 嗯!确实,下划线很有趣。有没有在任何地方提到过?然而它默默地什么也不做。它确实在目标 library.zip 中创建了一个文件夹,但它是空的。这是我在 build_exe 选项 "zip_includes": [("C:/Python27/Lib/site-packages/pytz/zoneinfo/", "pytz/zoneinfo/")] 中提供的其他内容。 pytz/zoneinfo/ 是空的:( 另外python setup.py bdist 确实在 dist 文件夹中创建 ZIP。 我认为 cx_Freeze 的文档中没有提到它。如果我能解决它,我会添加一个注释。也许它不会自动复制整个文件夹?您可能必须使用 os.listdir() 来构建所需文件的列表。 【参考方案1】:

你可以解决这个问题,添加以下方法:

def include_files():
        path_base = "C:\\Python27\\Lib\\site-packages\\pytz\\zoneinfo\\"
        skip_count = len(path_base) 
        zip_includes = [(path_base, "pytz/zoneinfo/")]
        for root, sub_folders, files in os.walk(path_base):
            for file_in_root in files:
                zip_includes.append(
                        ("".format(os.path.join(root, file_in_root)),
                         "".format(os.path.join("pytz/zoneinfo", root[skip_count:], file_in_root))
                        ) 
                )      
        return zip_includes

然后,进入 setup.py 文件:

build_exe_options = "packages": ["os"],
                     "excludes": ["tkinter"],
                     "zip_includes": include_files(),
                     ...
                     

希望有帮助

【讨论】:

这对我很有用,谢谢!我不得不做一个小调整:skip_count 需要添加 1 否则它有一个前导斜杠,这会吹走 os.path.join 的第一个参数。 嗯,python 3.4。区域信息包含在pytz\zoneinfo 中但未找到【参考方案2】:

我在 Python 3.4 中通过以下方式解决了这个问题

import pytz
setup(
    ...
    options = 'build_exe':
        'include_files': (pytz.__path__[0],), ...,
    , 
)

然后pytz 包含在其所有时区的解压缩中

【讨论】:

以上是关于cx_freeze:如何将包文件添加到 library.zip 中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Cocoapods 的情况下手动将包添加到 Swift

带有 Lerna 的纱线工作区仍在将包添加到子文件夹

将cx_Freeze msi添加到路径

将包添加到适用于 Windows 的 Python“嵌入式”安装

mybatis环境搭建

在运行时将包添加到 dojo 配置