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

问题描述 投票:0回答:3

我有一个名为

clana
GithubPyPI)的包,其结构如下:

.
├── 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.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
丢失了。我怎样才能确定它在那里?

python setuptools setup.py python-packaging
3个回答
10
投票

您可以在

MANIFEST.in
旁边添加文件名
setup.py
以及要添加的文件列表,允许使用通配符(例如:
include *.yaml
include clana/config.yaml
) 那么选项
include_package_data=True
将激活清单文件


10
投票

简而言之:将

config.yaml
添加到
MANIFEST.in
,并设置
include_package_data
。缺一不可。

基本上是这样的:

  1. MANIFEST.in
    将文件添加到
    sdist
    源分发)。
  2. include_package_data
    将这些相同的文件添加到
    bdist
    构建的发行版),即将
    MANIFEST.in
    的效果扩展到
    bdist
  3. exclude_package_data
    防止
    sdist
    中的文件添加到
    bdist
    ,即过滤
    include_package_data
    的效果。
  4. package_data
    将文件添加到
    bdist
    ,即将构建工件(通常是自定义构建步骤的产品)添加到您的
    bdist
    ,当然对
    sdist
    没有影响。

因此,在您的情况下,文件

config.yaml
未安装,因为它未添加到您的
bdist
内置发行版)。根据文件的来源,有两种方法可以解决此问题:

  • 该文件是构建工件(通常是在

    ./setup.py build
    阶段以某种方式创建的),那么您需要将其添加到
    package_data
    ;

  • 或者该文件是您源代码的一部分(通常位于您的源代码存储库中),那么您需要将其添加到

    MANIFEST.in
    ,设置
    include_package_data
    ,并将其保留在
    exclude_package_data
    之外(这似乎是你的情况在这里)。

相关


0
投票

根据包含数据文件的文档,如果您的包有数据文件,例如

.yaml
文件,您可以像这样包含它们:

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

这将允许包含文件扩展名为

.yaml
的包中的任何文件。

© www.soinside.com 2019 - 2024. All rights reserved.