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 для создания значения версии.

Другие вопросы по тегам