【问题标题】:Python egg creation ignores non .py filesPython egg 创建忽略非 .py 文件
【发布时间】:2018-08-07 07:33:35
【问题描述】:

我想从两个目录创建一个 egg 并希望包含 .config.log 文件。目录结构如下:

MSKDataDownloader
|_______configs
        |________sensors.config


MSKSubscriber
|_______doc
        |________dependencies.log

这是我的setup.py 文件:

from setuptools import setup, find_packages

setup(
        name='MSKDataDownloader',
        version='1.0.0',
        description='Data Downloader',
        packages=find_packages(),
        include_package_data=True,
        package_data={
        'MSKDataDownloader': ['config/*.config'],
        'MSKSubscriber': ['doc/*.log']
        'MSKSubscriber': ['config/*.config']
        }
)

我做错了什么?为什么不包括鸡蛋中的.config.log 文件。

【问题讨论】:

    标签: python egg


    【解决方案1】:

    问题是include_package_data=True 并不意味着你认为它的意思(或者大多数合理的人会认为它意味着什么)。简短的版本是,摆脱它。


    来自the docs

    如果设置为True,这会告诉setuptools 自动包含它在您的包目录中找到的任何数据文件,这些文件由您的MANIFEST.in 文件指定。有关详细信息,请参阅下面关于 Including Data Files 的部分。

    如果您点击链接,您会发现它实际上使setuptools 忽略了您在package_data 中明确告诉它的任何内容,而是查找MANIFEST.in 中提到的每个文件并在您的目录树中找到它(或源代码控制树):

    如果使用setuptools 特定的include_package_data 参数,package_data 指定的文件将不会自动添加到清单中,除非它们在MANIFEST.in 文件中列出。

    而且,由于您没有MANIFEST.in,这意味着您最终一无所有。

    所以,你想做两件事之一:

    • 删除include_package_data=True
    • 创建MANIFEST.in 并删除package_data=…

    这一切都因为distributeday1 遗留的大量示例、博客文章和教程对于现代setuptools 来说是完全错误的事实而变得复杂。事实上,过时和错误的帖子比正确的帖子要多得多。

    显而易见的答案是只使用 pypa.org 上 PyPA 中的教程和示例……但不幸的是,他们没有得到涵盖您需要的所有内容的书面教程。

    因此,通常情况下,您几乎必须阅读旧教程,然后在参考文档中查看他们告诉您的所有内容,看看哪些部分是错误的。


    1。 IIRC,在distribute 中,include_package_data=True 导致您的额外文件被添加到 sdist,而不是其他任何东西。听起来还是没用的,对吧?除了你可以让你的 egg 和其他发行版依赖于构建 sdist 然后运行以编程方式生成MANIFEST.in 的脚本。哪个有用……我忘了,可能与从源代码管理中提取版本文件有关?

    【讨论】:

    • 感谢您的详细解答。我错过了一件事。您是否建议我将 .config 文件的内容复制到 MANIFEST.in 文件?但是我的代码正在寻找.config 文件,那么这有什么帮助呢?我有点困惑!
    • @Rohit 不,如果你走那条路,你想添加文件,而不是它们的内容。但更简单的解决方案是不使用include_package_data=True
    • 我尝试了您的建议,但每当我运行 setup.py 文件时,都会删除 .config 和 .log 文件。我想没有办法在鸡蛋中包含 .config 文件?
    • @Rohit 肯定有一种方法可以在鸡蛋中包含 .config 文件。没有看到您尝试过的minimal reproducible example,我无法调试它。但是,与此同时,处理配置文件的常用方法是将它们视为pkg_resources,并更改您的程序以使用resource_stream 读取它们。毕竟,一旦将配置文件放入 egg 存档,您打算如何在运行时读取它们?即时解压缩鸡蛋?