заморозка пипа без зависимостей установленных пакетов

Когда я делаю pip freeze, я получаю пакеты, которые я явно установил, а также те пакеты, которые являются зависимостями от этих пакетов.

Например:

$ pip install fabric
...
$ pip freeze
Fabric==1.0.1
paramiko==1.7.6
pycrypto==2.3

Хорошо, хорошо, но затем я перехожу к установке этого требования.txt в другой среде с pip install. Я получу тот же результат с удалением последних двух строк.

Итак, мой вопрос: как я могу создать максимально упрощенный файл requirements.txt, в котором не показаны все вычисляемые зависимости?


person Tom Viner    schedule 05.05.2011    source источник


Ответы (3)


Теперь есть (отказ от ответственности: я сделал это).

Все, что вам нужно, это установить pip-chill из PyPI и запустить pip-chill из вашей среды Python.

Если вы чувствуете себя авантюрно и не хотите закреплять версии (или хотите использовать pip-compile), вы можете использовать pip-chill --no-version, и это даст вам минимальные требования для вашей текущей среды.

https://github.com/rbanffy/pip-chill

person rbanffy    schedule 16.10.2016
comment
Это как раз то, о чем я просил! Спасибо. - person Tom Viner; 19.10.2016
comment
Ты мой герой! Искал это несколько лет ;-) - person sheats; 14.09.2019
comment
Обратите внимание, что pip-chill требует pip›=10. На pip==9 он не вызывает модуль с именем pip._internal. Исправлено в virtualenv pip install --upgrade pip - person krubo; 09.10.2019
comment
Спасибо тебе за это!! - person tmhs; 05.05.2020
comment
Сохранил мое развертывание. Спасибо! - person omer; 18.01.2021
comment
Это должно быть объединено с самим пунктом. Спасибо! - person ospider; 11.04.2021

Невозможно создать "наиболее упрощенные требования.txt" с помощью pip - и я не знаю, понадобится ли он вам в этом случае.

Хорошо иметь все пакеты в файле requirements.txt, потому что вы уверены в том, какие версии зависимостей работают с вашей средой.

Подумайте об обновлении paramiko и нарушении обратной совместимости: у вас будут проблемы.

person Hugo Tavares    schedule 05.05.2011
comment
Я не думаю, что all packages правильно. Поскольку pip install -r requirements.txt установит зависимость автоматически, нам просто нужны корневые/оригинальные пакеты. - person Nam G VU; 05.10.2016
comment
@NamGVU: я сказал, что хорошо иметь все пакеты, а не то, что это обязательно. Рекомендуется указывать все пакеты, потому что вы лучше контролируете свою среду. Подумайте о данном пакете A, который зависит от B==1.0.0, а B зависит от C (любой версии). Пакет A должен требовать только B==1.0, но если по какой-либо причине пакет C будет обновлен обратно несовместимым образом, у пакета A могут возникнуть проблемы (поскольку в нем не указано, какая версия пакета C гарантированно будет работать). Таким образом, для A безопаснее указать как B==1.0.0 , так и проверенную версию C, и вы знаете, что она работает. - person Hugo Tavares; 06.10.2016
comment
Правильная/совместимая версия C определяется как B, а не A; и это работает автоматически по пипу. Спасибо, что поделились. - person Nam G VU; 06.10.2016
comment
@NamGVU: мир Python не идеален, и часто люди не указывают строгие версии для своих непосредственных зависимостей. Я видел, как эта проблема случалась много раз. Один случай, который приходит на ум, это когда python-statsd ошибочно указал mock (не закрепленную версию) в качестве зависимости, и вдруг новейшая версия mock требует другой версии setuptools. Некоторые из моих серверов сломались, потому что они использовали python-statsd==1.6.0 и не указывали полную иерархию зависимостей. См. git.io/vPWIW и github.com/testing-cabal/mock/issues/261 - person Hugo Tavares; 06.10.2016
comment
Спасибо, что поделились таким конкретным образцом на python-statsd; и потом, я полностью согласен прикрепить версию здесь. Я также согласен, что с командой разработчиков pip что-то не так. - person Nam G VU; 07.10.2016
comment
Кстати, я люблю Python и хочу присоединиться, чтобы сделать его совершенным. Где мы можем прочитать определение зависимости для одного пакета pip @hugotavares? - person Nam G VU; 07.10.2016

pipdeptree — еще один вариант.

Он создает полный файл requirements.txt (с pipdeptree -f) следующим образом:

jupyter==1.0.0
  ipykernel==5.4.3
    ipython==7.19.0
      backcall==0.2.0
      decorator==4.4.2
      jedi==0.17.2
        parso==0.7.1

Этот файл служит двум целям:

  • Используется как традиционный файл requirements.txt, переданный pip install;
  • Используется как удобный для разработчиков список пакетов (например, созданный pip-chill) просто с grep '^\w' requirements.txt.
person Leo    schedule 21.01.2021