setup.py не устанавливает требования
Я сделал библиотеку Python, это моя первая библиотека Python, опубликованная на pypl и github
Библиотека работает очень хорошо, а setup() - нет.
Когда я устанавливаю его pip install
, он dowloand пакет appfly, но не устанавливает требования: Flask,flask_cors, Flask-SocketIO and jsonmerge
, Поэтому мне нужно установить его самостоятельно. Если я сам устанавливаю зависимости, это работает очень хорошо, но я думаю, что это неправильный способ использовать библиотеку Python, верно?
вот мой setup.py
файл, я делаю что-то не так?
from setuptools import setup, find_packages
from appfly import __version__ as version
with open('README.md') as readme_file:
readme = readme_file.read()
# with open('HISTORY.md') as history_file:
# history = history_file.read()
requirements = [
'Flask==1.0.2',
'flask_cors==3.0.6',
'Flask-SocketIO==3.0.2',
'jsonmerge==1.5.2'
]
setup(
author="Italo José G. de Oliveira",
author_email='italo.i@live.com',
classifiers=[
'Natural Language :: English',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
description="This pkg encapsulate the base flask server configurations",
install_requires=requirements,
license="MIT license",
long_description=readme,
include_package_data=True,
keywords='appfly',
name='appfly',
packages=find_packages(),
url='https://github.com/italojs/appfly',
version=version,
zip_safe=False,
)
3 ответа
Причиной этой ошибки является то, что setup.py
импорт из упаковки. Это означает, что python попытается импортировать библиотеку во время обработки setup.py
(т.е. до того, как какая-либо из зависимостей будет установлена).
Поскольку вы импортируете пакет только для получения информации о версии, этот импорт можно заменить другим способом.
Простой способ сделать это - включить информацию о версии прямо в setup.py
, но недостатком этого является то, что версия больше не является единственным источником.
Другие методы включают в себя немного работы, но позволяют информации о версии продолжать получать из одного источника. См. https://packaging.python.org/guides/single-sourcing-package-version/ для получения рекомендаций. На этой странице есть список параметров, некоторые из которых могут лучше подходить для настройки вашего пакета, чем другие. Я лично предпочитаю вариант 3:
Установите значение в
__version__
Глобальная переменная в выделенном модуле вашего проекта (например, version.py), затем прочитайте setup.py и введите значение в переменную....
Используя exec:
version = {} with open("...sample/version.py") as fp: exec(fp.read(), version) # later on we use: version['__version__']
Вы также можете определить версию в
__init__.py
вашего пакета, например:
__version__ = "1.1.0"
Тогда вместо импорта
__version__
в твоей
setup.py
, вы можете прочитать init .py и извлечь версию.
Собственно, это решение, предложенное в официальных руководствах Python:
https://packaging.python.org/guides/single-sourcing-package-version/
Другой вариант - использовать пакет versioneer (его использует pandas).
versioneer использует теги Git для создания значения версии.