控制Setup.py中数据目录的包含和排除的正确语法是什么? [英] What's the right syntax for controlling Inclusion and Exclusion of data directories in 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
预期结果:
在目标计算机上安装文件树I需要:
📁 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文档之后,我真的不太清楚包括和排除非源代码目录和文件的正确方法。似乎许多可能的解决方案都已弃用!
执行此操作的正确方法是什么?
谁能给我指几个好的工作例子?
推荐答案
以下是最终起作用的解决方案。
我确实记得删除了旧的构建和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_INcluded 包括数据文件目录2/index.html ...
现在我正在获取所需的文件树。
其他备注: 实际上,我仍然不清楚为什么这些具体的改变会奏效,但我尝试过的其他解决方案却不起作用。但我现在可以继续我的安装,所以我想这已经足够好了,我将在已解决的情况下结束此操作。
请求:我想向社区中编写文档、如何指导或制作教学视频的人发出我的请求,让他们的解释不那么含糊和混乱,并提供更多实用的手册示例和解释。
需要改进的方面:对我来说,我经常感到困惑的一个具体方面是,一个文档显示操作员对";包&进行操作,而另一个文档则表示操作员对";目录进行操作。
混淆加剧,因为有时";Package";一词仅指其中包含init.py文件的目录。
选择包这个词似乎表明这些运算符不适合使用不包含init.py文件任何数据目录。确实,在某些情况下,操作员似乎只限于python包目录。然而,有些操作符似乎确实在任何子目录上工作,甚至那些不包含init.py文件.*的操作符也是如此。然而,一些作者提到,当目录和目录的误导性较小时,它们会在";包&上操作。
最后,最重要的是,";Package";有时可能只表示setup.py sdist创建的安装tar.gz文件或setup.py bdist_heel创建的.whl文件。
任何人,只要能够创建权威解释,其中setupTools或MANIFEST.IN运算符对任何目录起作用(但不起作用),并且只对包含init.py文件的目录起作用。
亲爱的读者,您是我们的英雄吗?
任何人如果尝试这样的解释并成功避免落入这个令人困惑的包的多种不同含义的丛林中,将为社区做了一项相当有价值的服务。
你是那个准备好接受繁重劳动的英雄吗?
这篇关于控制Setup.py中数据目录的包含和排除的正确语法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!