Статьи

Пересмотр упаковки Python с помощью Pipenv

Python — один из самых дружественных, но самых мощных языков. Новичкам легко его освоить, но он обладает сильным ударом и широко используется в различных областях, таких как научное программирование, программирование веб-приложений и DevOps. Но одним из слабых мест Python была его поддержка упаковки сложных приложений и их зависимостей.

За эти годы было много усилий, чтобы улучшить ситуацию. В августе 2017 года я написал учебник о современном состоянии упаковки Python: как писать, упаковывать и распространять библиотеку в Python .

Прошло всего четыре месяца, и в городе появился новый игрок. Pipenv теперь официально рекомендованный инструмент для упаковки от PyPA (Python Packaging Authority). Из этого руководства вы узнаете, почему Pipenv значительно улучшает состояние упаковки и общий процесс разработки для разработчиков на Python и как эффективно его использовать.

Цель Pipenv — улучшить рабочий процесс разработчиков Python, когда дело доходит до управления зависимостями и виртуальными средами. Это еще одна замечательная библиотека от трудолюбивого Кеннета Рейтца , который известен в основном пакетом запросов (HTTP для людей), но написал несколько других превосходных пакетов.

Да! Pipenv берет страницу из современных методов управления пакетами и импортирует их в мир Python.

Вы можете установить Pipenv с помощью pip install pipenv . Вы получите хороший результат с Emojis:

1
2
$ pip install pipenv
✨?✨

Тебе придется сделать это только один раз. Если у вас не установлен pip, вы можете использовать эту команду начальной загрузки: $ curl https://github.com/pypa/pipenv/blob/master/get-pipenv.py | python | python

Pipenv может создать пустую виртуальную среду для вас. Вот быстрое демо:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
~/git > mkdir testpipenv
~/git > cd testpipenv
~/git/testpipenv > pipenv —three
 
Output:
 
Creating a virtualenv for this project…
Using /usr/local/bin/python3 to create virtualenv…
⠋Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix ‘/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6’
New python executable in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python3.6
Also creating executable in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python
Installing setuptools, pip, wheel…done.
 
Virtualenv location: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy
Creating a Pipfile for this project…

Это создаст пустой Pip-файл без зависимостей. Но поскольку вы, вероятно, захотите установить несколько пакетов для своего проекта, вы можете просто использовать pipenv для установки пакета, и он автоматически создаст виртуальную среду. Например:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
~/git/testpipenv > pipenv install requests
 
Output:
 
 
Installing requests…
Collecting requests
  Using cached requests-2.18.4-py2.py3-none-any.whl
Collecting idna<2.7,>=2.5 (from requests)
  Using cached idna-2.6-py2.py3-none-any.whl
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Using cached chardet-3.0.4-py2.py3-none-any.whl
Collecting certifi>=2017.4.17 (from requests)
  Using cached certifi-2017.11.5-py2.py3-none-any.whl
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Using cached urllib3-1.22-py2.py3-none-any.whl
Installing collected packages: idna, chardet, certifi, urllib3, requests
Successfully installed certifi-2017.11.5 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22
 
Adding requests to Pipfile’s [packages]…
  PS: You have excellent taste!
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (7b8df8)!

Уровень детализации отличный, и в нем тоже используются приятные цвета. Вот полученный Pipfile:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
[[source]]
 
url = «https://pypi.python.org/simple»
verify_ssl = true
name = «pypi»
 
 
[dev-packages]
 
 
 
[packages]
 
requests = «*»
 
 
[requires]
 
python_version = «3.6»

Pipfile отслеживает зависимости верхнего уровня вашего проекта — здесь просто requests = "*" . Он использует TOML в качестве формата, который в наши дни является популярным выбором для файлов конфигурации (Rust’s Cargo, Python’s PEP-518).

Файл Pipefile.lock, с другой стороны, представляет собой файл JSON, в котором указаны некоторые метаданные и точные версии (включая хэши) всех рекурсивных зависимостей (зависимостей верхнего уровня и их зависимостей). Вот файл Pipfile.lock:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
{
   «_meta»: {
       «hash»: {
           «sha256»: «33a0ec7c8e3bae6f62dd618f847de92ece20e2bd4efb496927e2524b9c7b8df8»
       },
       «host-environment-markers»: {
           «implementation_name»: «cpython»,
           «implementation_version»: «3.6.3»,
           «os_name»: «posix»,
           «platform_machine»: «x86_64»,
           «platform_python_implementation»: «CPython»,
           «platform_release»: «16.7.0»,
           «platform_system»: «Darwin»,
           «platform_version»: «Darwin Kernel Version 16.7.0: Wed Oct 4 00:17:00 PDT 2017; root:xnu-3789.71.6~1/RELEASE_X86_64»,
           «python_full_version»: «3.6.3»,
           «python_version»: «3.6»,
           «sys_platform»: «darwin»
       },
       «pipfile-spec»: 6,
       «requires»: {
           «python_version»: «3.6»
       },
       «sources»: [
           {
               «name»: «pypi»,
               «url»: «https://pypi.python.org/simple»,
               «verify_ssl»: true
           }
       ]
   },
   «default»: {
       «certifi»: {
           «hashes»: [
               «sha256:244be0d93b71e93fc0a0a479862051414d0e00e16435707e5bf5000f92e04694»,
               «sha256:5ec74291ca1136b40f0379e1128ff80e866597e4e2c1e755739a913bbc3613c0»
           ],
           «version»: «==2017.11.5»
       },
       «chardet»: {
           «hashes»: [
               «sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691»,
               «sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae»
           ],
           «version»: «==3.0.4»
       },
       «idna»: {
           «hashes»: [
               «sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4»,
               «sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f»
           ],
           «version»: «==2.6»
       },
       «requests»: {
           «hashes»: [
               «sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b»,
               «sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e»
           ],
           «version»: «==2.18.4»
       },
       «urllib3»: {
           «hashes»: [
               «sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b»,
               «sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f»
           ],
           «version»: «==1.22»
       }
   },
   «develop»: {}

Если вы хотите увидеть график всех ваших зависимостей, введите: pipenv graph

1
2
3
4
5
6
~/git/testpipenv > pipenv graph
requests==2.18.4
  — certifi [required: >=2017.4.17, installed: 2017.11.5]
  — chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
  — idna [required: <2.7,>=2.5, installed: 2.6]
  — urllib3 [required: >=1.21.1,<1.23, installed: 1.22]

После установки пакета с помощью Pipenv он становится доступным в вашей виртуальной среде, как и стандартный пакет (так же, как если бы вы установили его с помощью pip). Единственная мера предосторожности заключается в том, что вы должны использовать интерпретатор виртуальной среды. Pipenv предоставляет две полезные команды: run и shell .

Вы используете pipenv run python <your program>.py , и вы используете pipenv shell для запуска новой оболочки с вашим интерпретатором Python виртуальной среды. Вот как можно использовать команду оболочки для запуска интерактивного сеанса Python, который использует пакет установленных запросов, чтобы получить смету дня из REST API. Виртуальная среда активируется, и при запуске Python используется правильный интерпретатор, где доступны requests .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
~/git/testpipenv > pipenv shell
Spawning environment shell (/bin/bash).
source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate
~/git/testpipenv > source /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/activate
(testpipenv-0GShD6dy) ~/git/testpipenv > python
Python 3.6.3 (default, Nov 19 2017, 16:39:12)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.38)] on darwin
Type «help», «copyright», «credits» or «license» for more information.
>>> import requests
>>> r = requests.get(‘https://quotes.rest/qod’)
>>> r.ok
True
>>> r.json()
{‘success’: {‘total’: 1}, ‘contents’: {‘quotes’: [{‘quote’: ‘Hang Out with People Who are Better than You.’, ‘author’: ‘Warren Buffett’, ‘length’: None, ‘tags’: [‘getting-better’, ‘inspire’, ‘people’], ‘category’: ‘inspire’, ‘title’: ‘Inspiring Quote of the day’, ‘date’: ‘2018-01-03’, ‘id’: None}], ‘copyright’: ‘2017-19 theysaidso.com’}}
>>> quote = r.json()[‘contents’][‘quotes’][0][‘quote’]
>>> author = r.json()[‘contents’][‘quotes’][0][‘author’]
>>> print(f'{quote} ~~ {author}’)
Hang Out with People Who are Better than You.
>>>

Если вы хотите перенести существующий проект в файл require.txt, Pipenv поможет вам. Просто: pipenv install -r <path/to/requirements.txt> .

Все ваши зависимости будут импортированы в Pipfile. Чтобы фактически установить зависимости и сгенерировать Pipfile.lock, вам нужно pipenv install . После того, как вы убедились, что все работает должным образом, вы можете удалить свой файл needs.txt.

Если ваш файл require.txt существует в том же каталоге, в котором вы создаете виртуальную среду, тогда Pipenv автоматически сгенерирует Pip-файл. Но имейте в виду, что если ваш файл require.txt содержит закрепленные версии, они также будут закреплены в Pipfile. В мире Pipenv закрепление должно происходить в файле Pipfile.lock. Pipenv даст дружеское напоминание. См. ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
~/git/testpipenv > cat requirements.txt
requests==2.18.4
~/git/testpipenv > pipenv —three
Creating a virtualenv for this project…
Using /usr/local/bin/python3 to create virtualenv…
⠋Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix ‘/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6’
New python executable in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python3.6
Also creating executable in /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy/bin/python
Installing setuptools, pip, wheel…done.
 
Virtualenv location: /Users/gigi.sayfan/.local/share/virtualenvs/testpipenv-0GShD6dy
Requirements.txt found, instead of Pipfile!
Warning: Your Pipfile now contains pinned versions, if your requirements.txt did.
We recommend updating your Pipfile to specify the «*» version, instead.

Вот закрепленная версия в Pipfile, которую рекомендуется изменить на «*»:

1
2
3
[packages]
 
requests = «==2.18.4»

Давайте установим зависимости сейчас:

01
02
03
04
05
06
07
08
09
10
~/git/testpipenv > pipenv install
Pipfile.lock not found, creating…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (0b0daf)!
Installing dependencies from Pipfile.lock (0b0daf)…
  ? ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 5/5 — 00:00:01
To activate this project’s virtualenv, run the following:
 $ pipenv shell
~/git/testpipenv >

Вы можете указать Pipenv установить путь как редактируемый. Это полезно, когда вы зависите от разрабатываемых вами пакетов и хотите зависеть от исходного пакета, фактически не устанавливая их каждый раз, когда вы вносите изменения. В частности, это полезно для текущего каталога, когда вы активно работаете в нем. Для этого используйте флаги -e и --dev :

1
> pipenv install ‘-e .’

У вас должен быть правильный файл setup.py.

Вы уже видели многое из того, что Pipenv может сделать для вас. Давайте углубимся в некоторые дополнительные команды и опции.

Команда pipenv install поддерживает несколько параметров:

  • --dev : Установить как --dev разработки, так и пакеты по умолчанию из Pipfile.lock.
  • --system : используйте команду system pip, а не команду вашего virtualenv.
  • --ignore-pipfile : игнорировать Pipfile и установить его из Pipfile.lock.
  • --skip-lock : игнорировать файл Pipfile.lock и установить его из файла Pipfile. Кроме того, не записывайте файл Pipfile.lock, отражающий изменения в файле Pipfile.

В зависимости от вашего рабочего процесса и предпочтений, вы можете использовать один или несколько из этих параметров в разное время.

Чтобы удалить зависимость, введите: pipenv uninstall <package name> . Например:

1
2
3
4
5
6
7
8
9
~/git/testpipenv > pipenv uninstall requests
Un-installing requests…
Uninstalling requests-2.18.4:
  Successfully uninstalled requests-2.18.4
 
Removing requests from Pipfile…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (625834)!

Обратите внимание, что мне не нужно было указывать «запросы == 2.8.14» при удалении, хотя это было закреплено в Pipfile.

Если вы хотите создать моментальный снимок ваших текущих зависимостей (например, перед выпуском), используйте команду блокировки. Это ключ к детерминированным и повторяемым сборкам: pipenv lock --pre .

Pipenv великолепен, но вы можете время от времени очищать некоторые из ваших виртуальных сред. Это так же просто, как pipenv --rm .

Pipfile.lock использует некоторые новые улучшения безопасности в pip. По умолчанию файл Pipfile.lock будет создан с хэшем sha256 каждого загруженного пакета. Это позволит pip гарантировать, что вы устанавливаете то, что намереваетесь, когда находитесь в скомпрометированной сети, или загружаете зависимости из ненадежной конечной точки PyPI.

Кроме того, Pipenv предоставляет команду check , которая проверяет соответствие PEP 508 — Спецификация зависимостей для пакетов программного обеспечения Python, а также безопасность пакетов:

1
2
3
4
5
~/git/testpipenv > pipenv check .
Checking PEP 508 requirements…
Passed!
Checking installed package safety…
All good!

Pipenv наконец-то выводит упаковку Python на передний край современной разработки программного обеспечения. Это черпает вдохновение из других успешных систем управления зависимостями, таких как Rust’s Cargo и Javascript’s Yarn.

Он сочетает в себе виртуальные среды и управление пакетами и обеспечивает превосходное взаимодействие с красивыми и красочными информационными сообщениями и неявными лучшими практиками! Я настоятельно рекомендую вам начать использовать Pipenv для управления проектами Python.

Кроме того, не стесняйтесь посмотреть, что у нас есть в наличии для продажи и для изучения на рынке Envato , и не стесняйтесь задавать любые вопросы и предоставлять ценные отзывы, используя канал ниже.