Tox не может скопировать не Python файл при установке модуля
Это древовидная структура модуля, который я пишу setup.py
файл для:
ls .
LICENSE
README.md
bin
examples
module
scratch
setup.py
tests
tox.ini
Я настроил свой setup.py
следующее:
from setuptools import setup, find_packages
setup(
name="package_name",
version="0.1",
packages=find_packages(),
install_requires=[
# [...]
],
extras_require={
# [...]
},
tests_require={
'pytest',
'doctest'
},
scripts=['bin/bootstrap'],
data_files=[
('license', ['LICENSE']),
],
# [...]
# could also include long_description, download_url, classifiers, etc.
)
Если я установлю пакет из среды Python (также virtualenv)
pip install .
LICENSE
файл правильно установлен.
Но работает tox
:
[tox]
envlist = py27, py35
[testenv]
deps =
pytest
git+https://github.com/djc/couchdb-python
docopt
commands = py.test \
{posargs}
Я получаю эту ошибку:
running install_data
creating build/bdist.macosx-10.11-x86_64/wheel/leafline-0.1.data
creating build/bdist.macosx-10.11-x86_64/wheel/leafline-0.1.data/data
creating build/bdist.macosx-10.11-x86_64/wheel/leafline-0.1.data/data/license
error: can't copy 'LICENSE': doesn't exist or not a regular file
Удаление data_files
часть из setup.py делает tox
работает правильно.
2 ответа
Ваша проблема здесь в том, что setuptools не может найти файл 'LICENSE' в файлах, которые были включены для построения исходного дистрибутива. У вас есть 2 варианта, чтобы указать setuptools включить этот файл (оба были указаны здесь):
- Добавить
MANIFEST.in
файл (например, https://github.com/pypa/sampleproject/) - использование
include_package_data=True
в вашем файле setup.py.
С помощью MANIFEST.in
часто проще и легче проверить из-за https://pypi.org/project/check-manifest/, что позволяет использовать автоматизацию для проверки того, что все действительно правильно (если вы используете VCS, такой как Git или SVN).
pip install .
строит колесо, используя python setup.py bdist_wheel
который устанавливается путем простой распаковки, как определено в спецификации колес: https://www.python.org/dev/peps/pep-0427/
tox
создает исходный дистрибутив, используя python setup.py sdist
, который затем распаковывается и устанавливается с помощью python setup.py install
,
Это может быть причиной разницы в поведении для вас.
У меня есть несколько файлов ресурсов внутри моих пакетов, которые я использую во время выполнения. Чтобы сделать настройку хранить их в пакете с кодом Python, я использую include_package_data=True
и я получаю к ним доступ, используя importlib.resources
, Вы можете использовать backport для более старой версии Python, чем 3.7 или другой библиотеки.
Перед каждым выпуском у меня есть скрипт, который проверяет, что все нужные мне файлы находятся внутри bdist
руль, чтобы быть уверенным, что все на месте.