如何制作 pip 安装包数据(配置文件)?

我有一个名为clana( Github , PyPI ) 的包,其结构如下:


.

├── 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": "info@martin-thoma.de",

    "maintainer": "Martin Thoma",

    "maintainer_email": "info@martin-thoma.de",

    "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.yaml位于同一目录中。cli.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缺少了。我怎样才能确定它在那里?


慕姐4208626
浏览 162回答 3
3回答

九州编程

您可以在要添加的文件列表MANIFEST.in旁边添加一个文件名setup.py,允许使用通配符(例如:include *.yaml或include clana/config.yaml),然后该选项include_package_data=True将激活清单文件

弑天下

简而言之:添加config.yaml到MANIFEST.in,并设置include_package_data。一个没有另一个是不够的。基本上它是这样的:MANIFEST.in将文件添加到sdist(源分发)。include_package_data将这些相同的文件添加到bdist(构建的发行版),即它扩展了MANIFEST.into的效果bdist。exclude_package_data防止sdist将文件添加到 中bdist,即过滤include_package_data.package_data将文件添加到bdist,即它向您添加构建工件(通常是自定义构建步骤的产品)bdist,当然对sdist.因此,在您的情况下,该文件config.yaml未安装,因为它未添加到您的bdist(构建的发行版)中。根据文件的来源,有两种方法可以解决此问题:要么该文件是构建工件(通常它是在该./setup.py build阶段以某种方式创建的),那么您需要将其添加到package_data;或者该文件是您的源代码的一部分(通常在您的源代码存储库中),那么您需要将其添加到MANIFEST.in、 setinclude_package_data并将其排除在外exclude_package_data(这似乎是您的情况)。看:https://stackoverflow.com/a/54953494/11138259https://setuptools.readthedocs.io/en/latest/setuptools.html#include-data-files

蛊毒传说

根据包含数据文件的文档,如果您的包有文件等数据文件.yaml,您可以像这样包含它们:setup(    ...    package_data={        "": ["*.yaml"],    },    ...)这将允许包含您的包中具有文件扩展名的任何文件.yaml。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python