python-3.x 我怎样才能让pip安装包数据(一个配置文件)?

6ovsh4lw  于 2023-11-20  发布在  Python
关注(0)|答案(3)|浏览(101)

我有一个名为clanaGithubPyPI)的包,其结构如下:

.
├── clana
│   ├── cli.py
│   ├── config.yaml
│   ├── __init__.py
│   ├── utils.py
│   └── visualize_predictions.py
├── docs/
├── setup.cfg
├── setup.py
├── tests/
└── tox.ini

字符串
setup.py看起来像这样:

from setuptools import find_packages
from setuptools import setup

requires_tests = [...]

install_requires = [...]

config = {
    "name": "clana",
    "version": "0.3.6",
    "author": "Martin Thoma",
    "author_email": "[email protected]",
    "maintainer": "Martin Thoma",
    "maintainer_email": "[email protected]",
    "packages": find_packages(),
    "entry_points": {"console_scripts": ["clana=clana.cli:entry_point"]},
    "install_requires": install_requires,
    "tests_require": requires_tests,
    "package_data": {"clana": ["clana/config.yaml"]},
    "include_package_data": True,
    "zip_safe": False,
}

setup(**config)

如何检查没有工作

python3 setup.py sdist
open dist/clana-0.3.8.tar.gz  # config.yaml is not in this file

真实的支票

我以为这样可以确保安装软件包时config.yamlcli.py在同一个目录下。但是当我尝试这样做时:

virtualenv venv
source venv/bin/activate
pip install clana
cd venv/lib/python3.6/site-packages/clana
ls


我明白了:

cli.py  __init__.py  __pycache__  utils.py  visualize_predictions.py


我把它上传到PyPI的方式是:

python3 setup.py sdist bdist_wheel && twine upload dist/*


所以config.yaml不见了。我怎么能确定它在那里?

nuypyhwy

nuypyhwy1#

您可以在setup.py旁边添加一个文件名MANIFEST.in,并列出您要添加的文件(例如:include *.yamlinclude clana/config.yaml),然后选择include_package_data=True将激活清单文件

dw1jzc5e

dw1jzc5e2#

简而言之:将config.yaml添加到MANIFEST.in,并设置include_package_data。一个没有其他是不够的。
基本上是这样的:

  1. MANIFEST.in将文件添加到sdist(* 源分发 *)。
  2. include_package_data将这些相同的文件添加到bdistbuilt distribution),即它将MANIFEST.in的效果扩展到bdist
  3. exclude_package_data防止sdist中的文件被添加到bdist,即它过滤了include_package_data的效果。
  4. package_data将文件添加到bdist,即它将构建工件(通常是自定义构建步骤的产品)添加到您的bdist,当然对sdist没有影响。
    因此,在您的情况下,文件config.yaml没有安装,因为它没有添加到您的bdistbuilt distribution)中。根据文件的来源,有两种方法可以解决这个问题:
  • 要么这个文件是一个构建工件(通常它是在./setup.py build阶段以某种方式创建的),那么你需要将它添加到package_data;
  • 或者该文件是源代码的一部分(通常它在源代码存储库中),那么您需要将其添加到MANIFEST.in,设置include_package_data,并将其保留在exclude_package_data之外(这似乎是您的情况)。
  • 相关 *:
  • https://stackoverflow.com/a/54953494
  • https://setuptools.pypa.io/en/latest/userguide/datafiles.html
n53p2ov0

n53p2ov03#

根据包含数据文件的文档,如果您的软件包包含数据文件,如.yaml文件,您可以这样包含它们:

setup(
    ...
    package_data={
        "": ["*.yaml"],
    },
    ...
)

字符串
这将允许包含包中任何文件扩展名为.yaml的文件。

相关问题