Python требования конфликтуют с PyPi - PullRequest
6 голосов
/ 18 февраля 2020

У меня есть проект, которому требуется DevOps TL C, поэтому я наконец-то создаю свой установочный скрипт. В конечном итоге это будет пакет, который будет доступен для установки pip локально, но может не оказаться в PyPI.

У него есть зависимость для модуля с именем u2py. Это этот пакет , созданный для операций с базой данных U2, не этот пакет для ... чего-то еще. Тот, который я хочу, устанавливается только сторонним поставщиком (Rocket), а тот, который мне не нужен, - в PyPI.

Каким должно быть ожидаемое поведение моего пакета в этом случае? Я включу объявление об этом в моем файле readme do c, но достаточно ли этого?

Я думал о создании исключения, чтобы определить, когда присутствует неправильный пакет, но это заставляет меня чувствовать себя странно. Кажется, что, возможно, самая большая вещь для pythoni c - это НЕ добавлять это в мой скрипт установки и слепо предполагать, что import u2py приводит к модулю, который я могу использовать. Если он крякает как утка, разбирает DynArray как утка и call() s SUBROUTINE как утка, тогда это утка, верно? В противном случае, если возникнет ошибка, пользователь просто go и фактически прочитает документы.

Я посмотрел classifiers, но не уверен, применимы ли они здесь.

Ответы [ 3 ]

2 голосов
/ 18 февраля 2020

Это был бы случай, когда было бы неплохо, если бы у Python проектов были пространства имен (pip install com.rocket.u2py и import com.rocket.u2py as u2py).

С моей точки зрения, есть два аспекта, которые следует учитывать: на проект уровень, на уровне пакет уровень.

1. проект (пакет распространения)

Я считаю, что это плохая практика заставить альтернативные источники загрузки для конечного пользователя вашего проекта. По умолчанию pip следует загружать с PyPI и нигде, кроме случаев, когда пользователь сам решит это (с помощью --find-links или аналогичных опций, которые вы можете указать своим пользователям в своей документации). ).

Поскольку это такая нишевая зависимость, думаю, я бы просто не добавил ее к install_requires. Я бы предположил, что конечные пользователи вашего проекта уже знают о зависимости и могут установить ее самостоятельно.

Также я не верю, что можно надежно проверить в время установки если установлена ​​правильная зависимость, поскольку setup.py не всегда запускается (может помочь переопределение команды bdist_wheel, но, вероятно, неэффективно на 100%).

2. package ( импортный пакет)

Я не уверен, что необходимо какое-то конкретное c действие. Скорее всего, код рано или поздно потерпит неудачу, потому что модуль или функция не импортируются. Что может быть хорошо-я sh, может быть?

Но, вероятно, определить, установлена ​​ли зависимость (и она правильная), относительно легко и обеспечит лучший пользовательский опыт. Либо проверьте, что некоторые указанные c модули или функции являются импортируемыми. Или проверьте метаданные (import importlib_metadata; importlib_metadata.distribution('u2py').metadata['Author']).

В случае приложения я бы попытался изящно завершить работу как можно скорее. В случае библиотеки я бы попытался найти одно стратегическое c место для размещения чека и вызвать специальное исключение (CannotFindU2pyException).


Ссылки:

2 голосов
/ 18 февраля 2020

В идеале во время установки (в setup.py) должен быть способ определить, устанавливается ли пакет в «среду u2» или нет, и может произойти сбой установки (с соответствующим сообщением об ошибке), если это случай.

С этим решением вы не сможете предоставить встроенные дистрибутивы (колеса), так как они не выполняют файл setup.py во время установки, а просто публикация исходных дистрибутивов должна подойти. .

1 голос
/ 18 февраля 2020

Вы можете указать URL для пакета в install_requires с помощью setuptools (требуется версия пипа 18.1 или выше).

Спецификаторы требований

Пример

setup.py

import setuptools

setuptools.setup(
    name='MyPackage',
    version='1.0.0',
    # ...
    install_requires=[
        'requests @ https://github.com/psf/requests/archive/v2.22.0.zip'
    ]
    # ...
)

и do python setup.py install

Также

Начиная с версии 19.1, pip также поддерживает прямой ссылки вроде так:

SomeProject @ file: ///somewhere/...

Ref

...