【问题标题】:How can I make pip install package data (a config file)?如何制作 pip 安装包数据(配置文件)?
【发布时间】:2020-01-22 02:11:10
【问题描述】:

我有一个名为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": "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.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 不见了。我怎样才能确定它在那里?

【问题讨论】:

  • @Erwan 是的。就像我在上面的文字中发布的那样。
  • 你试过config.yaml而不是clana/config.yaml吗?
  • 它适用于MANIFEST.in(谢谢你,Erwan!) - 但我认为include_package_data=True 我不需要那个。为什么include_package_data 不起作用?
  • sdist 主要由文件MANIFEST or its template MANIFEST.in 控制,而不是setup.pysetup.py 中的 include_package_data=True 用于 bdist_*bdist_eggbdist_wheel 等)命令。

标签: python python-3.x setuptools python-packaging


【解决方案1】:

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

【讨论】:

  • 这行得通,谢谢! (+1) - 我不接受这个答案(现在),因为我希望有人知道为什么include_package_data 不起作用。
【解决方案2】:

简而言之:将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之外(这似乎是你的情况)。

见:

【讨论】:

  • @MartinThoma 这回答了问题吗?您还有什么想澄清的吗?
【解决方案3】:

the documentation on including data files开始,如果你的包有.yaml文件之类的数据文件,你可以像这样包含它们:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2021-03-03
    相关资源
    最近更新 更多