Как Python / pip обрабатывает конфликтующие переходные зависимости? - PullRequest
2 голосов
/ 06 февраля 2020

Предположим, я хочу установить пакет a, для которого требуются пакеты b1 и b2. В свою очередь, b1 требует c > 1.0.0, а b2 требует c < 1.0.0. Таким образом, требования b1 и b2 не могут быть выполнены одновременно с одним и тем же пакетом.

В принципе / в других языках программирования это не проблема. Можно установить две версии c бок о бок и убедиться, что b1 использует другую версию, отличную от b2.

Однако я не уверен, что pip может установить две версии одного и того же пакета , Мой первый вопрос: может ли pip установить две версии одного пакета?

Мой главный вопрос - как на самом деле можно решить эту проблему? Единственный способ, который я могу себе представить, это

  1. fork b1 (или b2) и версия c, которая работает для вилки, и загрузить b1_forked и c_for_b1_forked в PyPI, или
  2. Включите код b1 (или b2) непосредственно в мой проект

Оба варианта кажутся более проблемными c, чем необходимо.

Что я пробовал

>>> import natsort; print(natsort.__file___)
'/home/moose/.local/lib/python3.6/site-packages/natsort/__init__.py'

$ cd /home/moose/.local/lib/python3.6/site-packages
$ ls
[... a lot of *.dist-info directories, some .py files, some .so files, ]
[... some directories called like the packages I've installed]

Так что я почти уверен, что именно здесь Python ищет установленные пакеты и устанавливает только одну версию (хотя каталоги *-dist-info меня немного смущают) .

В этом блоге предполагается, что на данный момент не существует хорошего решения для конфликтующих транзитивных зависимостей. Помогают ли в этом другие проекты (например, поэзия)?

1 Ответ

4 голосов
/ 06 февраля 2020

В принципе / на других языках программирования это не проблема. Можно установить две версии c рядом и убедиться, что b1 использует другую версию, чем b2.

Это не решение. Если c управляет общим ресурсом (например, консолью), рано или поздно b1 и b2 помешают вводу или выводу друг друга через разные c s, и вы получите неправильный ввод и вывод мусора.

То, что вы описываете, является общей проблемой, не ограничиваясь Python или pip. Единственное решение - изменить b1 и / или b2, чтобы согласовать версию c. Или понизить b1, чтобы разрешить c < 1.0, или обновить b2, чтобы c > 1.0.

Может ли pip установить две версии одного пакета?

Нет, и проблема не в pip, а в Python: его система импорта не позволяет импортировать из разных версий одного и того же пакета. Вы можете посмотреть на mitsuhiko/multiversion (Python2 -только).

...