Хотя управление зависимостями Pipenv (IMO) немного лучше, чем поэзия (не стесняйтесь спорить со мной в комментариях), все же есть сценарии, в которых pipenv терпит неудачу. В этой статье я подробно описываю, как отлаживать сбойные зависимости.

Во-первых, вы можете попробовать установить пакеты и найти такую ​​​​ошибку:

$ pipenv install -r requirements.txt --pre --skip-lock                                                                                                                                     Loading .env environment variables...                                                                                                                                                                                                          Requirements file provided! Importing into Pipfile...                                                                                                                                                                                          
Loading .env environment variables...                                                                                                                                                                                                          Requirements file provided! Importing into Pipfile...                                                                                                                                                                                          
Installing dependencies from Pipfile...

(... spend some time spooling, and then...)

An error occurred while installing amqp! Will try again.                                                                                                                                                                                       
An error occurred while installing appnope! Will try again.                                                                                                                                                                                    
An error occurred while installing argon2-cffi! Will try again.                                                                                                                                                                                
An error occurred while installing argon2-cffi-bindings! Will try again.                                                                                                                                                                       
An error occurred while installing asgiref==3.7.2! Will try again.                                                                                                                                                                             
An error occurred while installing astroid! Will try again.                                                                                                                                                                                    
An error occurred while installing asttokens! Will try again.                                                                                                                                                                                  
An error occurred while installing async-generator! Will try again.
....

Installing initially failed dependencies...                                                                                                                                                                                                    [pipenv.exceptions.InstallError]: Collecting amqp                                                                                                                                                                                              [pipenv.exceptions.InstallError]:   Using cached amqp-5.1.1-py3-none-any.whl (50 kB)                                                                                                                                                           [pipenv.exceptions.InstallError]: Collecting appnope                                                                                                                                                                                           [pipenv.exceptions.InstallError]:   Using cached appnope-0.1.3-py2.py3-none-any.whl (4.4 kB)                                                                                                                                                   [pipenv.exceptions.InstallError]: Collecting argon2-cffi                                                                                                                                                                                       
[pipenv.exceptions.InstallError]:   Using cached argon2_cffi-21.3.0-py3-none-any.whl (14 kB)                                                                                                                                                   
[pipenv.exceptions.InstallError]: Collecting argon2-cffi-bindings                                                                                                                                                                              
[pipenv.exceptions.InstallError]:   Using cached argon2_cffi_bindings-21.2.0-cp36-abi3-manylinuxPIPENV_VENV_IN_PROJECT17_x86_64.manylinux2014_x86_64.whl (86 kB)                                                                                                  
[pipenv.exceptions.InstallError]: Collecting asgiref==3.7.2                                                                                                                                                                                    
[pipenv.exceptions.InstallError]:   Using cached asgiref-3.7.2-py3-none-any.whl (24 kB)                                                                                                                                                        
[pipenv.exceptions.InstallError]: Collecting astroid                                                                                                                                                                                           
[pipenv.exceptions.InstallError]:   Using cached astroid-3.0.0a5-py3-none-any.whl (276 kB)                     

...

ERROR: Couldn't install package: [Requirement(_name='amqp', vcs=None, req=NamedRequirement(name='amqp', version='', req=Requirement.parse('amqp'), extras=[], editable=False, _parsed_line=<Line (editable=False, name=amqp, path=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None, pyproject_requires=None, pyproject_backend=None, ireq=amqp)>), markers=None, _specifiers='', index=None, editable=False, hashes=frozenset(), extras=(), abstract_dep=None, _line_instance=<Line (editable=False, name=amqp, path=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None, pyproject_requires=None, pyproject_backend=None, ireq=amqp)>, _ireq=None), Requirement(_name='appnope', vcs=None, req=NamedRequirement(name='appnope', version='', req=Requirement.parse('appnope'), extras=[], editable=False, _parsed_line=<Line (editable=False, name=appnope, path=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None, pyproject_requires=None, pyproject_backend=None, ireq=appnope)>), markers=None, _specifiers='', index=None, editable=False, hashes=frozenset(), extras=(), abstract_dep=None, _line_instance=<Line (editable=False, name=appnope, path=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None, pyproject_requires=None, pyproject_backend=None, ireq=appnope)>, _ireq=None), Requirement(_name='argon2-cffi', vcs=None, req=NamedRequirement(name='argon2-cffi', version='', req=Requirement.parse('argon2-cffi'), extras=[], editable=False, _parsed_line=<Line (editable=False, name=argon2-cffi, path=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None,
 pyproject_requires=None, pyproject_backend=None, ireq=argon2-cffi)>), markers=None, _specifiers='', index=None, editable=False, hashes=frozenset(), extras=(), abstract_dep=None, _line_instance=<Line (editable=False, name=argon2-cffi, path
=None, uri=None, extras=(), markers=None, vcs=None, specifier=None, pyproject=None, pyproject_requires=None, pyproject_backend=None, ireq=argon2-cffi)>, _ireq=None), Requirement(_name='argon2-cffi-bindings', vcs=None, req=NamedRequirement(
name='argon2-cffi-bindings', version='',

...

Обычно это происходит, если у вас есть Pipfile в одной среде (скажем, на вашем ПК), а затем вы решаете перенести свой проект в другую среду (скажем, на свой ноутбук) или коллега настраивает его.

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

И никакой pipenv install --debug не дает ничего дополнительно полезного.

Полезный совет по настройке: включите PIPENV_VENV_IN_PROJECT

Прежде чем начать, я бы рекомендовал включить флаг PIPENV_VENV_IN_PROJECT:

$ export PIPENV_VENV_IN_PROJECT=1

Это помогает убедиться, что у вас есть каталог .venv, в котором вы работаете. Помогает стереть каталог, если что-то пойдет не так (чего мы и ожидаем).

Экспорт pipenv в файл requirements.txt

Очевидно, что это нужно делать на машине с работающим pipenv.

$ pipenv requirements

Добавьте requirements.txt в систему управления версиями, если это еще не сделано, и отправьте изменения в репозиторий.

Разделение установки пакета

Существует множество причин, по которым не удается установить pipenv. Итак, мы собираемся установить один за другим.

Не волнуйтесь, мы не будем копировать и вставлять сюда. Мы собираемся программно пройтись по каждому из них, пока возьмем латте и посмотрим на результаты.

Установите средство записи сеанса

Прежде чем мы начнем, я настоятельно рекомендую установить средство записи сеансов, например screen или asciinema, если вы еще этого не сделали. Ваша IDE или терминал обрезают большую часть вывода, поэтому наличие готового файла поможет вам обнаружить, что не так.

$ # start the session log
$ asciinema rec pipenv_debug.asciinema

Создайте файл debug_pipenv_install.sh и поместите его в исходный каталог, где находится файл requirements.txt.

#!/bin/bash

while read -r requirement; do
    echo "INSTALLING $requirement"
    pipenv run pip install $requirement
done < requirements.txt

Этот простой скрипт создаст виртуальную среду (в текущем каталоге, если у вас есть PIPENV_VENV_IN_PROJECT=1 , в /home/user/.virtualenvs/... в противном случае), а затем запустит pip в этой среде.

Я бы порекомендовал стереть файл .env, если он существует, или если это ваша сотая попытка разрешить зависимости.

$ rm -fr .venv

Не беспокойтесь о том, что ваш pipenv устанавливается в неправильной среде. pipenv умен, поэтому pipenv run… создаст виртуальную среду, если она не существует.

Теперь запустите скрипт:

$ bash debug_pipenv_install.sh

Вы увидите скрипт, говорящий INSTALLING <package_name>, а затем прогресс каждого пакета.

Выявление того, что пошло не так

В файле устройства записи экрана будет много шатких символов, так что давайте добавим его и преобразуем символы:

$ asciinema cat ./pipenv_debug.asciinema \
  | sed -e 's/\x1b\[[0-9;]*m//g' > ./pipenv_debug.asciinema.log

Ищите все, что связано с error. Для меня это было довольно легко определить:

...
      running build_ext
      building 'MySQLdb._mysql' extension
      creating build/temp.linux-x86_64-3.11
      creating build/temp.linux-x86_64-3.11/MySQLdb
      x86_64-linux-gnu-gcc -Wsign-compare -DNDEBUG -g -fwrapv -O2 -Wall -g -fstack-protector-strong -Wformat -Werror=format-security -g -fwrapv -O2 -g -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -Dversion_info=(2,1,1,'final',0) -D__version__=2.1.1 -I/usr/include/mysql -I/home/jordan/projects/upwork/brecarria/.venv/include -I/usr/include/python3.11 -c MySQLdb/_mysql.c -o build/temp.linux-x86_64-3.11/MySQLdb/_mysql.o -std=c99
      MySQLdb/_mysql.c:46:10: fatal error: Python.h: No such file or directory
         46 | #include "Python.h"
            |          ^~~~~~~~~~
      compilation terminated.
      error: command '/usr/bin/x86_64-linux-gnu-gcc' failed with exit code 1
      [end of output]
  
  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for mysqlclient
...

Это всего лишь фрагмент. И в моем случае есть несколько ошибок. Каждую нужно решать по очереди. Я не буду углубляться во все, что может пойти не так, потому что это зависит от пакетов, которые вам нужно установить. Но использование pip для установки пакетов может показать, какие пакеты не работают.

Заключение

В этой статье я рассказал, как разрешать зависимости pipenv. Это предполагает нестандартное мышление и использование вместо этого pip для установки пакетов. Это поможет выявить, что пошло не так, когда pip пытался установить пакет.

📢 Комментарий ниже: я что-то пропустил? Вы сталкивались с этой головной болью? Какую стратегию вы использовали?

👉‍‍ Поделитесь этой статьей с 3 своими друзьями или коллегами. В Twitter, LinkedIn или Mastodon. Обязательно отметьте меня в публикации. Помогает мне узнать, актуален ли мой контент.

💓 Подпишитесь на DamnGoodTech на Ko-Fi всего за 7 долларов в месяц. Получайте статьи на 3 дня раньше и получайте благодарность за каждую статью! Это все равно, что нанять тимлида в вашу компанию по разработке программного обеспечения за гораздо меньшую заработную плату. 🙏🏻 Особая благодарность Джеймсу Н., Люси Р. и Стиву О. за вашу поддержку.

💼 Наймите меня в качестве руководителя технического отдела. У меня более 10 лет опыта разработки, и я хотел бы помочь вашей команде полностью раскрыть свой потенциал. Перейдите на https://damngood.tech/pages/schedule.html, чтобы назначить бесплатную консультацию.