问题描述
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 文件的目录。
尊敬的读者,您是我们的英雄吗?
任何尝试进行此类解释并成功避免陷入具有“包装”的多种不同含义的混乱丛林的人,都将为社区提供宝贵的服务。
您是机翼英雄准备承担辛勤劳动吗?