やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

pipenvを使ってみた

 pipenvはPythonの環境構築用ツール。

これまでのPythonにおける環境構築用ツール

  • easy_install(egg)
  • pip
  • virtualenv
  • pyenv
  • venv

 パッケージ管理だの、Python処理系だの、それぞれ用の管理ツールだの。そういったものがたくさんある。おかげで大混乱。

pipenv

 今回、さらに新しいツールpipenvを知ったので調べてみた。

 どうやらpipenvは、pyenvPython処理系をインストールし、venvでパッケージ仮想環境をつくり、pipでパッケージをインストールする管理ツールらしい。ようするに既存のツールを組み合わせて包括的な環境構築をするものっぽい。

インストール

pip3 install pipenv

使ってみる

コードを書く

mkdir test_project
cd test_project
vim a.py

a.py

#!/usr/bin/env python3
# coding: utf8
import requests
if __name__ == '__main__':
    response = requests.get('http://www.google.co.jp/')
    print(response.text)
chmod +x a.py

仮想環境を有効化する

pipenv shell

ログ

Creating a virtualenv for this project...
Pipfile: /tmp/work/test_project/Pipfile
Using /usr/bin/python3 (3.7.3) to create virtualenv...
⠇ Creating virtual environment...created virtual environment CPython3.7.3.final.0-32 in 1835ms
  creator CPython3Posix(dest=/home/pi/.local/share/virtualenvs/test_project-KUGFn0Qp, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/pi/.local/share/virtualenv)
    added seed packages: pip==21.2.4, setuptools==58.1.0, wheel==0.37.0
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

✔ Successfully created virtual environment! 
Virtualenv location: /home/pi/.local/share/virtualenvs/test_project-KUGFn0Qp
Creating a Pipfile for this project...
Launching subshell in virtual environment...
 . /home/pi/.local/share/virtualenvs/test_project-KUGFn0Qp/bin/activate
bash: pyenv: コマンドが見つかりません
$  . /home/pi/.local/share/virtualenvs/test_project-KUGFn0Qp/bin/activate

 仮想環境が有効化されると、ターミナルが以下のように表示される。

(test_project) $ 

 カレントディレクトリに以下Pipfileファイルができる。

Pipfile

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]

[dev-packages]

[requires]
python_version = "3.7"

処理系のバージョン指定

pipenv --python 3.7

 Pythonのバージョンを指定したいときは上記のようにする。

パッケージをインストールする

 仮想環境を有効化した状態で、以下のようにインストールする。

pipenv install requests

 Pipfileにパッケージの情報が追記される。

Pipfile

[packages]
requests = "*"

パス

 インストールパスは以下コマンドで判明する。

$ pipenv --venv
/home/pi/.local/share/virtualenvs/test_project-KUGFn0Qp

 いやいや、カレントに作ってくれよ。

更新

pipenv update

削除

 削除するときは以下。

pipenv --rm

開発用パッケージをインストールする

pipenv install --dev autopep8 flake8

Pipfile

[dev-packages]
autopep8 = "*"
flake8 = "*"

Pipfileから再現する

 ここが本番。Pipfileから一発で環境構築する。

pipenv install --dev

 開発用パッケージが不要なら以下。

pipenv install

Pipfile.lockから再現する

pipenv sync --dev
pipenv sync

 .lockファイルは厳密なバージョン指定がされている。

 Pipfileのほうはたぶん最新をインストールするのだろう。

 Pipfileのほうで再現し、もし問題があればPipfile.lockで再現する。そうすれば絶対に再現できるはずだ。

スクリプト

Pipfile

[scripts]
start = "python main.py runserver"
test = "python -m unittest discover -v"
format = "autopep8 -ivr ."
lint = "flake8 --show-source ."
pipenv run start
pipenv run test
pipenv run format
pipenv run lint

情報源

所感

  • 遅い
  • へんなところにインストールされる(カレントじゃない!)

 包括的に管理できるのはいいと思う。でも、遅い。

 今すでにインストールしてあるんだったら、それだけをPipfileに出力して、新たにインストールはしないでほしい。

 以下のような記事もあった。

 pipenvは微妙だな。pip freezeでパッケージを管理できればそれでいい気がする。venvさえいらない場合がほとんど。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux