различия между пользователями даже после использования Pipfile и Pipfile.lock с явными версиями - PullRequest
17 голосов
/ 30 апреля 2019

Извините за длину, это довольно сложная ситуация с pipenv.

В моей компании мы используем pipenv (с Pipfile и Pipfile.lock) для управления пакетами, используемыми на ноутбуках разных инженеров.Для нас это даже важнее, чем для большинства команд, потому что мы также используем Zappa для развертывания лямбда-кода AWS, и он, очевидно, упаковывает зависимости непосредственно с ноутбука развертывателя для их развертывания.Поэтому, если ноутбуки людей не полностью выровнены с точки зрения зависимостей, мы можем получить различное поведение в облаке в зависимости от того, кто его развернул.

Мы обнаружили, что даже после попытки полностью контролировать зависимости с помощью Pipfile иPipfile.lock, мы получаем разные пакеты Python на наших разных ноутбуках, как показано pip freeze и на что указывают ошибки в развернутом коде.

Вот точный процесс, который показывает различия между моим ноутбуком и боссом (код Pipfile, который я цитирую, состоит из нескольких строк, но я сокращаю его до одной строки, потому что у меня проблемы с форматированием SO):

  1. В самом начале все, что у нас было, это Pipfile с пакетами, указанными с подстановочными знаками, такими как [requires] python_version = "3.6" [packages] flask = "*".Кроме того, у нас не было Pipfile.lock, мой босс (который был первым программистом в этом проекте) всегда выполнял --skip-lock
  2. Чтобы лучше управлять, я начал с улучшения нашего Pipfile дозамените подстановочные знаки явными версиями, а также сделайте нашу версию Python более конкретной, например [requires] python_version = "3.6.4" [packages] Flask = "==1.0.2".Для этого я получил копию вывода pip freeze моего босса и скопировал версии в Pipfile, где было совпадение имен с тем, что было там указано (я пропустил все, что не соответствовало, потому что предположил, что это былозависимость вверх по течению, и мы еще не касались этого).Я совершил это.
  3. У нас все еще были проблемы, поэтому мы решили начать использовать Pipfile.lock для управления зависимостями вверх по течению.Итак, мой босс создал один из них, запустив pip install без --skip-lock в первый раз, и зафиксировал это.
  4. Я вытащил Pipfile.lock, удалил свое окружение с помощью pipenv --rm и заново создал его с pipenv install
  5. Мы оба запустили 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

Вот некоторые различия в Pipfile.lock между ноутбуками моего и моего босса. Pipfile.lock было получено, когда он запустил pipenv lock (за пределами pipenv shell, хотя я предполагаю, что это не имеет значения), а затем совершил это прямо сейчас. Затем я извлек это, удалил свою среду с помощью pipenv --rm, запустил pipenv install и получил следующие отличия от Pipfile.lock, который он только что совершил. Его версия снова слева.

Это все различия - я не понимаю, почему у нас здесь меньше различий, чем с pip freeze. Наш Pipfile остается прежним между нами.

enter image description here

enter image description here

enter image description here

enter image description here

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Единственный способ обеспечить совместное использование одной и той же среды - это синхронизировать с тем же Pipfile.lock, с pipenv sync (опционально pipenv sync --dev).

Pipfile - помощник для людей, посредник в создании Pipfile.lock, он не гарантирует, что зависимости точно такие же.

pipenv install вызовы под капотом 2 pipenv функция: lock и sync. pipenv lock сгенерирует Pipfile.lock из вашего Pipfile. Даже с закрепленной версией в Pipfile возможно иметь разные Pipfile.lock, если они генерируются в разные моменты, потому что зависимости закрепленных пакетов не могут быть закреплены (в зависимости от издателя). pipenv sync затем установите точные пакеты, найденные в Pipfile.lock.

Чтобы напрямую установить среду из зависимостей в Pipfile.lock, необходимо использовать pipenv --python 3.6 install --ignore-pipfile, в противном случае Pipfile.lock будет восстановлено из Pipfile.

Чтобы легко решить вашу проблему, исправьте версию Pipfile.lock (вы можете зафиксировать ее, если вы используете контроль версий, но вы, конечно, делаете;), тогда обе команды используют pipenv sync.

Затем сохраняйте Pipfile.lock точно таким же, пока вы работаете с минорной версией, исправляете ошибки ... и не стесняйтесь обновлять ее, чтобы получить последние зависимости для основных версий. В моем проекте почти все зависимости в Pipfile не закреплены, и когда мы запускаем новую основную версию, мы обновляем Pipfile.lock, чтобы попробовать новые версии зависимостей, протестировать все, иногда прикрепить зависимость к предыдущей версии, если последняя внесены обратно несовместимые изменения, и мы исправим Pipfile.lock до следующей основной версии.

0 голосов
/ 07 мая 2019

pipenv install устанавливается из Pipfile. Восходящие зависимости могут отличаться.

pipenv sync устанавливается с Pipfile.lock. Ничего не будет отличаться.

Это мое понимание чтения справки команды.

$ pipenv
Usage: pipenv [OPTIONS] COMMAND [ARGS]...

Commands:
  # ...
  install    Installs provided packages and adds them to Pipfile, or (if no
  # ...
  sync       Installs all packages specified in Pipfile.lock.
...