Как поддерживать альтернативные зависимости в пакете Python? - PullRequest
0 голосов
/ 12 сентября 2018

Я написал служебную библиотеку на Python, которая работает с фреймворком Qt.Мой код чистый Python и совместим как с PyQt5, так и с PySide2.Мой основной модуль может быть запущен отдельно из командной строки с помощью python -m или импортирован в другой проект.Есть ли чистый способ указать, что проекту нужен либо PyQt5, либо PySide2 в своем дистрибутиве колеса?

Вот что я нашел в своем исследовании, но я спрашиваю, если есть лучший способ упаковатьчем эти параметры:

Я мог бы добавить логику к setup.py в исходном дистрибутиве проекта, чтобы проверить наличие PyQt5 и PySide2.Тем не менее, колеса - это рекомендуемый способ распространения проектов Python, и из того, что я могу сказать, подобная логика времени установки невозможна для колес.В качестве альтернативы я не мог бы указать PySide2 или PyQt5 в качестве зависимостей и рекомендовать в инструкциях по установке, чтобы одна из них была установлена ​​вместе с моим проектом.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Использование extras_require:

setup(
    …
    extras_require={
        'pyqt5': ['PyQt5'],
        'pyside2': ['PySide2'],
    },
)

и научите своих пользователей запускать либо

pip install 'yourpackage[pyqt5]'

или

pip install 'yourpackage[pyside2]'
0 голосов
/ 16 сентября 2018

Мой конкретный случай несколько нишевый (поэтому я не принимаю это как ответ).Я понял, что пакет действительно делает две вещи: выступает в роли библиотеки и инструмента командной строки.Я решил разделить его на два пакета: package и package-cli.package явно не зависит от PyQt5 или PySide2, но указывает, что один из них должен быть установлен в документации.Поскольку package - это библиотека, она предназначена для интеграции в другой проект, в котором легко перечислить package и PyQt5 вместе в requirements.txt.Для package-cli я просто выбираю одно из PyQt5 или PySide2 в качестве явной зависимости.package-cli зависит от package и PyQt5 и просто добавляет console_script для вызова основного модуля в package.

0 голосов
/ 12 сентября 2018

Если вы не хотите предъявлять какие-либо строгие требования (что имеет смысл), я бы просто выдавал ошибку времени выполнения, если ни то, ни другое не доступно.

Например

try:
   import PyQt5 as some_common_name
except ImportError:
   try:
       import PySide2 as some_common_name
   except ImportError:
       raise ImportError('Please install either PyQt5 or PySide2') from None
...