Как я могу заставить данные пакета установки pip (файл конфигурации)? - PullRequest
1 голос
/ 21 сентября 2019

У меня есть пакет с именем 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отсутствует.Как я могу убедиться, что он там есть?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2019

Вы можете добавить имя файла MANIFEST.in рядом с setup.py со списком файлов, которые вы хотите добавить, с подстановочными знаками (например: include *.yaml или include clana/config.yaml), тогда опция include_package_data=True активируетфайл манифеста

1 голос
/ 22 сентября 2019

Короче: добавьте 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 ( встроенный дистрибутив ).Есть 2 способа исправить это в зависимости от того, откуда приходит файл:

  • либо файл является артефактом сборки (обычно он каким-то образом создается на этапе ./setup.py build), затем вынеобходимо добавить его в package_data;

  • или файл является частью вашего исходного кода (обычно он находится в вашем хранилище исходного кода), затем вам нужно добавить его в MANIFEST.inустановите include_package_data и оставьте его вне exclude_package_data (похоже, это ваш случай).

См .:

...