7839

雑草魂エンジニアブログ

【Python】Pipenvを用いたPython仮想環境(開発環境)

最近、やっとRaspberry Piを触ることができた。(以前から、ずっと触ってみたいと思い、つい衝動買いしてしまい、ずっと棚に閉まってしまっていた。。。)Raspberry Piで開発するにあたり、念願のPythonデビューも果たすこととした。私のようなPythonデビューをした初学者の参考になればと、備忘録として残しておく。

Python開発環境

Pythonに限らず、アプリケーション開発環境には、「ライブラリ依存関係の管理」が必要不可欠となる。

Pythonには「pip」というパッケージマネージャがある。(Node.jsの場合、npmやyarn。PHPの場合、Composer。)ただし、システム上に必要なパッケージをどんどんインストールしていくと、大量のパッケージがインストールされてしまい、他のライブラリ同士の干渉が発生したりと管理ができなくなってしまう。

そこで、Pythonでは、「仮想環境」を構築して開発を行っていくことが基本の「き」のようだ。仮想環境の中で、pythonのバージョンを設定し、パッケージをインストールすることでクリーンな開発環境を作ることができる。今回、Pythonの仮想環境構築に、Pipenvを用いたので紹介する。

Pipenvとは

pipenv-ja.readthedocs.io

プロジェクト毎のパッケージ管理や仮想環境の構築を簡単に自動で行ってくれるツールである。パッケージマネージャは「pip」、仮想環境の構築は「virtualenv」をそれぞれ使うことで実現できるが、pipenvはこれらをまとめてより簡単に扱えるようにサポートしてくれる。以下がPipenvの設定ファイルである。

ファイル名 内容
Pipfile ・各種パッケージとバージョンの管理
・開発用パッケージの管理
・定義したスクリプトの管理
Pipfile.lock ・インストールしたパッケージが依存しているパッケージとそのバージョンを管理
・パッケージの改ざんから守るためのハッシュの管理

(備考)pipの「requirements.txt」の代替ファイル。

Pipenv のインストール

Pipenvは、pipからインストールできる。

$ pip install --upgrade pip    # pipを最新版にアップグレードする
$ pip install pipenv    # pipenvをインストールする

Pipenv での環境構築ワークフロー

構築方法には、以下のパターンが想定される。

  1. ゼロから構築する場合
  2. Pipenvで開発していたプロジェクトファイルから構築する場合
  3. pipのrequirements.txtから構築する場合

どのパターンにおいても、 pipenv install を実行することで、必要なパッケージがインストールされ、仮想環境が構築される。まず、Pipenvで使用するコマンドを列挙する。

コマンド 内容
install Pipfileから仮想環境にパッケージをインストールしたり、新しくインストールしたパッケージをPipfileに追加する
shell 仮想環境を有効にする(サブプロセスを立ち上げる)
exit 仮想環境を無効にする(サブプロセスを終了させる)
uninstall 仮想環境からパッケージを削除する
lock Pipfile.lock を生成する
sync Pipfile.lock の全てのパッケージをインストールする
update lockを実行後に、syncを行う
graph 現在のインストール済みのパッケージを列挙する
check PEP 508 で定義されているように依存を確認する
clean Pipfile.lock にないパッケージを削除する

Pipenv CLI Reference — pipenv 2020.6.2.dev0 documentation

1. ゼロから構築する場合

Pythonで開発する場合に、まずは開発用のフォルダを作成し、そこに仮想環境を構築する。

# 任意のフォルダを作成する
$ mkdir ./myapp  
$ cd ./myapp

# 仮想環境構築
$ pipenv --python 3         #Python 3系を使う
$ pipenv --python 3.7.3   #Python 3.7.3を使う

# 仮想環境を有効にする
$ pipenv shell 
 
# サブシェルが起動するので、ディレクトリの前に(フォルダ名)がつく
(myapp)$ python --version
(myapp)$ Python 3.7.3

# 必要なパッケージをインストールする
(myapp)$ pipenv install [package names]
(myapp)$ pipenv install --dev [package names]  # Pipfileのdevelopとdefaultの両方のパッケージをインストール
(myapp)$ pipenv install --system [package names]  # 仮想環境ではなく、システムのpipでインストール

# 仮想環境を無効にする
(myapp)$ exit

2. Pipenvで開発していたプロジェクトファイルから構築する場合

PipfileやPipfile.lockのパッケージをインストールして構築する

# PipfileやPipfile.lockをもとに仮想環境構築
$ pipenv install
$ pipenv install --ignore-pipfile  # Pipfile を無視し、 Pipfile.lock を使ってインストール
$ pipenv install --skip-lock   # Pipfile.lock を無視し、 Pipfile を使ってインストール
$ pipenv sync # Pipfile.lock を使ってインストール

$ pipenv shell 

3. pipのrequirements.txtから構築する場合

pipenv install 実行時に、requirements.txt しか無い場合は、Pipenvは自動でそのファイルの内容をインポートし Pipfile を作成する。

# PipfileやPipfile.lockをもとに仮想環境構築
$ pipenv install
$ pipenv install -r path/to/requirements.txt   # requirements.txtのパス指定 

$ pipenv shell 

まとめ

適切な開発環境をつくることは本当に大切である。開発時には、エラーが付き物であるが、環境依存なのか、自分の実装コードに問題があるのか、大きく切り分けて前者をなるべく潰すことが開発スピードを高める鍵である。本音では、開発環境の隅から隅までを100%理解しておくことが大切であるが、初学者にとっては二の次である。まずは、実装あるのみであると思う。その中で、周辺の開発環境も詳細に理解していけばいいと思っている。

それでは、ステキな開発ライフを。