【问题标题】:Python package : data files of a subpackagePython包:子包的数据文件
【发布时间】:2021-06-28 06:40:55
【问题描述】:

我的包结构如下:

├───Docs
│   ├───Dir
│   └───Output
└───MyPackage
    ├───__init__.py
    ├───test
    ├───MySubPackage1
    │   ├───__init__.py
    │   ├───...
    │   └───data
    │         └─── data.pth
    └───MySubPackage2
        └───__init__.py

我需要包含data.pth 文件,所以我尝试建议there 使用MANIFEST.IN,如下所示:

MANIFEST.IN

graft data
setup.py

setup(name='MyPackage',
      version='1.0',
      package_dir={"MyPackage": "MyPackage"},
      packages=find_packages(),
      include_package_data=True)

但是在安装时:

python setup.py install

我看到以下警告:

reading manifest template 'MANIFEST.in'
warning: no directories found matching 'data'

处理位于带有MANIFEST.IN 的子包中的这些数据的正确方法是什么?

【问题讨论】:

标签: python setuptools


【解决方案1】:

您还可以使用setup()package_data 参数来明确指出必须包含在您的包或子包中的数据文件。这是我通常的做法,此类文件不需要明确包含在 MANIFEST.in 中:

setup(
    ...
    package_data={'MyPackage.MySubPackage': ['data.pth']}
)

例如。见https://setuptools.readthedocs.io/en/latest/userguide/datafiles.html

我认为您的setup() 中可能还有另一个小错误,即package_dir={"MyPackage": "MyPackage"}

package_dir 用于指定源代码树中的顶级目录,在该目录中可以找到要安装的 Python 包。默认为''(表示源的顶层)。

从您发布的源代码树看来,MyPackage 已经在源代码的顶层,因此您根本不需要此选项;这是多余的。我相信您编写它的方式确实有效。但是package_dir 更常用于您有备用源层次结构的情况。最常见的是在src/ 目录中找到您的 Python 包,在这种情况下,您指定 package_dir={'': 'src/'},这意味着所有 Python 包都在 src/ 下。在你的情况下,我认为你不需要这个。

【讨论】:

  • 是的,但这里不鼓励这样做:ep2015.europython.eu/media/conference/slides/…。我完全同意你使用package_dir。它确实在拥有例如时更有用。 src/mypackage。但它有效:)
  • 我不同意这一点,这似乎是不合理的,尽管我有一些模糊的记忆,关于很久以前与 Ionel 争论的确切问题。这就是该选项的用途。其中一些归结为个人喜好。
【解决方案2】:

我认为setuptools 在阅读MANIFEST.in 时能够理解包和子包的结构,但显然不是这样。

这样做:

MANIFEST.IN

graft MyPackage/MySubPackage1/data

解决问题

【讨论】:

    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-14
    • 2018-06-02
    • 1970-01-01
    • 2011-05-01
    • 2019-08-15
    • 2012-01-23
    相关资源
    最近更新 更多