在Setup.py中控制数据目录的包含和排除的正确语法是什么?

问题描述

Q:在使用 setup.py MANIFEST.IN 创建python发行版时,如何定义定义嵌套数据目录,我可以,也不想在最终安装目录(复杂的示例!)

背景:我的程序有一组数据目录(不是源目录)。在这些主目录中的每个目录中都有一些具有用户特定名称的子目录。在我的setup.py中,我要排除 我自己的数据目录,同时仍然包括所有用户应有权访问的其他子目录。

我的Pycharm开发环境中的文件当前存在

 ? PycharmProjects
    ? pythonProject
        ? data_files_directory_1
            ?subdirectory_to_be_EXcluded
                ? data_file_to_be_EXcluded.txt
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
            ? index.html
        ? data_files_directory_2
            ?subdirectory_to_be_EXcluded
                ? data_file_to_be_EXcluded.txt
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
            ? index.html
        ? src
            ? __init__.py
            ? constants.py
            ? helper1.py
            ? helper2.py
            ? main.py

预期结果:

目标计算机上的文件想要安装后

 ? PycharmProjects
    ? pythonProject
        ? data_files_folder_1
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
        ? data_files_folder_2
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
            ? index.html
        ? src
            ? __init__.py
            ? constants.py
            ? helper1.py
            ? helper2.py
            ? main.py

实际结果:

 ? PycharmProjects
    ? pythonProject
        ? data_files_directory_1
            ?subdirectory_to_be_EXcluded
                ? data_file_to_be_EXcluded.txt
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
            ? index.html
        ? data_files_directory_2
            ?subdirectory_to_be_EXcluded
                ? data_file_to_be_EXcluded.txt
            ?subdirectory_to_be_INcluded
                 ? data_file_to_be_INcluded.txt
            ? index.html
        ? src
            ? __init__.py
            ? constants.py
            ? helper1.py
            ? helper2.py
            ? main.py

我尝试过的操作/源代码

MANIFEST.IN

...
graft data_files_directory_1
graft data_files_directory_2
...

setup.py

setup(
    ...
    # include everything in MANIFEST.IN:
    include_package_data=True,# ...but exclude just these directories */subdirectory_to_be_EXcluded/* from all packages
    exclude_package_data={"": ["*/subdirectory_to_be_EXcluded/*"]},...
)

问题: 如您所见,排除请求将被忽略。

我必须承认,在setup.py和安装程序上大量使用Google,YouTube和PyCharm文档之后,我还不清楚如何 包括 排除 非源目录和文件。似乎许多可能的解决方案已被不推荐使用

正确方法是什么?

有人可以指出一些好的例子吗?

解决方法

这是最终可行的解决方案。

我确实记得删除了旧的 build dist 目录,并且我还确保按照 @jarcobi的建议删除所有* .egg-info文件。 。但是,仅清除所有过时的文件不足以解决问题。

最终可行的方法是这样编辑 setup.py

setup(
    ...
    packages=find_packages(exclude=["*/subdirectory_to_be_EXcluded/*"]),# include everything in MANIFEST.IN:
    include_package_data=True,# ...but exclude just these directories */subdirectory_to_be_EXcluded/* from all packages
    exclude_package_data={"": ["*/subdirectory_to_be_EXcluded/*"]},...
)

,然后编辑 MANIFEST.IN

...
graft data_files_directory_1/subdirectory_to_be_INcluded
include data_files_directory_1/index.html
graft 

data_files_directory_2 / subdirectory_to_be_IN包含 包括data_files_directory_2 / index.html ...

现在我正在获取所需的文件树。

其他说明: 实际上,我仍然不清楚这些特定更改为何有效,但是我尝试过的其他解决方案却没有。但是我现在可以继续进行安装了,所以我认为这已经足够好了,我已经解决了这个问题。

要求:我想向社区中那些撰写文档,如何指导或制作教学视频的人提出要求,以使许多人对这些说明的理解不再那么含糊和令人困惑更多有效的Cookbook示例和说明。

有待改进的地方:对我来说,我经常感到困惑的一个特定领域是,一个文档说操作员对“包装”进行操作,而另一个文档则表明操作员对“目录”进行操作。

由于有时将“软件包” 一词用于表示具有 init.py 的“仅”目录,这种混乱加剧了> 文件”。

“ package”一词的选择似乎表明,这些运算符对于任何不包含 init.py 文件。

实际上,在某些情况下,运算符似乎确实仅限于python软件包目录。但是,即使不包含 init.py 文件的操作符,某些操作符似乎仍可以在任何子目录上工作。*。但是,有些作者称它们在“目录”不太容易引起误解的情况下在“包”上运行。

最后,最重要的是,“包”有时可能表示 setup.py sdist 创建的安装tar.gz文件或 .whl 创建的文件通过 setup.py bdist_wheel

任何可以创建权威解释的人,其中 setuptools MANIFEST.IN 操作员可以使用(但不起作用) )在任何目录上,并且仅适用于包含 init.py 文件的目录。

尊敬的读者,您是我们的英雄吗?

任何尝试进行此类解释并成功避免陷入具有“包装”的多种不同含义的混​​乱丛林的人,都将为社区提供宝贵的服务。

您是机翼英雄准备承担辛勤劳动吗?