Извините за длину, это довольно сложная ситуация с pipenv.
В моей компании мы используем pipenv (с Pipfile
и Pipfile.lock
) для управления пакетами, используемыми на ноутбуках разных инженеров.Для нас это даже важнее, чем для большинства команд, потому что мы также используем Zappa для развертывания лямбда-кода AWS, и он, очевидно, упаковывает зависимости непосредственно с ноутбука развертывателя для их развертывания.Поэтому, если ноутбуки людей не полностью выровнены с точки зрения зависимостей, мы можем получить различное поведение в облаке в зависимости от того, кто его развернул.
Мы обнаружили, что даже после попытки полностью контролировать зависимости с помощью Pipfile
иPipfile.lock
, мы получаем разные пакеты Python на наших разных ноутбуках, как показано pip freeze
и на что указывают ошибки в развернутом коде.
Вот точный процесс, который показывает различия между моим ноутбуком и боссом (код Pipfile, который я цитирую, состоит из нескольких строк, но я сокращаю его до одной строки, потому что у меня проблемы с форматированием SO):
- В самом начале все, что у нас было, это
Pipfile
с пакетами, указанными с подстановочными знаками, такими как [requires] python_version = "3.6" [packages] flask = "*"
.Кроме того, у нас не было Pipfile.lock
, мой босс (который был первым программистом в этом проекте) всегда выполнял --skip-lock
- Чтобы лучше управлять, я начал с улучшения нашего
Pipfile
дозамените подстановочные знаки явными версиями, а также сделайте нашу версию Python более конкретной, например [requires] python_version = "3.6.4" [packages] Flask = "==1.0.2"
.Для этого я получил копию вывода pip freeze
моего босса и скопировал версии в Pipfile
, где было совпадение имен с тем, что было там указано (я пропустил все, что не соответствовало, потому что предположил, что это былозависимость вверх по течению, и мы еще не касались этого).Я совершил это. - У нас все еще были проблемы, поэтому мы решили начать использовать
Pipfile.lock
для управления зависимостями вверх по течению.Итак, мой босс создал один из них, запустив pip install
без --skip-lock
в первый раз, и зафиксировал это. - Я вытащил
Pipfile.lock
, удалил свое окружение с помощью pipenv --rm
и заново создал его с pipenv install
- Мы оба запустили
pip freeze
и сравнили результаты, но у нас все еще есть ряд различий.
Полагаю, мой босс может удалить его pipenv
окружение и переустановить его на основе зафиксированных Pipfile
и Pipfile.lock
, но, поскольку они основаны на его pip freeze
, я бынемного удивлен, если это что-то изменило.
Так что мне просто интересно: действительно ли это поведение неожиданно?Я всегда думал, что комбинация pipenv
, Pipfile
и Pipfile.lock
будет гарантировать, что два человека будут иметь одинаковые пакеты, если каждая версия заблокирована с ==[version]
.Есть ли что-то еще, что нам нужно сделать, чтобы получить очень точное совпадение?
Если это действительно неожиданно, единственное, что я могу подумать, это то, что, возможно, он не пробежал pipenv shell
до своего pip freeze
, но я думаю, что он сделал, потому что все хорошо совпало с Pipfiles
.
Примечание: я не конвертировал наши [dev-packages]
в Pipfile
, чтобы иметь версии, потому что я не уверен, что этоделает, и я предполагаю, что это не имеет значения.Так что они все еще похожи на pylint = "*"
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Ниже приведена дополнительная информация для ответа на комментарии ... но сначала пара интересных вещей, которые я заметил:
- Ни одно из отличий в первом скриншоте (для
pip freeze
diffs) не в Pipfile
. - Похоже, мой вывод
pip freeze
соответствует содержимому Pipfile.lock
, но мой боссне делает.Я думаю, что это может объяснить различия, но немного удивительно, что его вывод pip freeze
не будет соответствовать Pipfile.lock
, созданному его собственным pipenv lock
, если только проблема не в том, что он запускает pipenv lock
извне pipenv shell
.
Чтобы ответить на комментарии ... Вот первая часть различий между выводами замораживания пипса (оба изнутри оболочки pipenv) на ноутбуках моего и моего босса:
![enter image description here](https://i.stack.imgur.com/NhnsJ.png)
Вот некоторые различия в Pipfile.lock
между ноутбуками моего и моего босса. Pipfile.lock
было получено, когда он запустил pipenv lock
(за пределами pipenv shell
, хотя я предполагаю, что это не имеет значения), а затем совершил это прямо сейчас. Затем я извлек это, удалил свою среду с помощью pipenv --rm
, запустил pipenv install
и получил следующие отличия от Pipfile.lock
, который он только что совершил. Его версия снова слева.
Это все различия - я не понимаю, почему у нас здесь меньше различий, чем с pip freeze
. Наш Pipfile
остается прежним между нами.
![enter image description here](https://i.stack.imgur.com/cP6Tv.png)
![enter image description here](https://i.stack.imgur.com/G9aGy.png)
![enter image description here](https://i.stack.imgur.com/Y9dUT.png)
![enter image description here](https://i.stack.imgur.com/55oEU.png)