Pythonは2系と3系で大きく仕様が異なり、
環境構築を意識して行わないと、プログラムが動かないことがある。
2系は既にサポートを終了している。
とは言え、やむをえず2系を触らなければいけない状況があったりする。
また、同じ3系のバージョンでも
チーム内で利用する言語のバージョンは合わせておくのがベストである。
ということで、
今回は私の個人的な環境構築のベストプラクティスを紹介する。
まずはバージョンの確認方法
PCにインストールされているPythonのバージョン確認方法は以下の通り。
$ python --version
Python 2.7.16
私のPCにインストールされているバージョンは2.7.16
ということが分かる。
今回使う技術
今回使う技術はpyenv
とpipenv
の2つである。
pyenv
pyenvは、PC内で利用するPythonのバージョンを管理する。
PC全体で利用するPythonのバージョンを切り替えたり、
「ディレクトリA配下で利用するバージョンは2系で、
ディレクトリB配下で利用するバージョンは3系」
というように、ディレクトリ単位でバージョンを管理することができる。
インストールされていれば良い。
pipenv
Pythonはいろいろなライブラリをインストールし、
それを駆使してプログラムを作成することがほとんどである。
pipenv
は、主にそのライブラリ管理のために利用する。
JavaScriptではnpm
、PHPではcomposer
に相当する。
pyenvとpipenvの役割分担
pyenv
:Pythonのバージョンを管理するpipenv
:利用するライブラリ一覧を管理する
プロジェクトの作成
今回、それぞれのインストール方法は割愛する。
以下のコマンドでプロジェクトの作成を行う。
このとき利用するPythonのバージョンを指定する。
$ pipenv --python 3.7
すると、Pipfile
というファイルが作成される。
この後にライブラリなどをインストールすると、
その情報がこのファイルに記録されていく。
$ ls
Pipfile
$ cat Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true
[dev-packages]
[packages]
[requires]
python_version = "3.7"
エラーが出た場合
このとき、以下のようなエラーが出た場合は、
今使っているPythonのバージョンを3.7.3
にする必要がある。
$ pipenv --python 3.7
pyenv: pipenv: command not found
The `pipenv' command exists in these Python versions:
3.7.3
以下の手順でPythonのバージョン確認とバージョン設定を行う。
# Pythonのバージョンを確認すると、3.7ではないことが分かる
$ python --version
Python 2.7.16
# pyenvを使ってそのディレクトリで利用するPythonのバージョンを設定する
$ pyenv local 3.7.3
# .python-versionというファイルが作成され、そこにバージョン情報が記録される
$ ls -la .python-version
-rw-r--r-- 1 username staff 6B 8 1 11:18 .python-version
# Pythonのバージョンを確認すると、3.7.3になっていることが確認できる
$ python --version
Python 3.7.3
ここまででプロジェクトの作成は完了である。
ライブラリのインストール
os
,pprint
,json
などの標準ライブラリはimport文を記載するだけで問題ないが、pandas
,Numpy
などの外部ライブラリを利用するときは別途インストール作業が必要になる。
ライブラリのインストール方法は2種類存在する。
- PC全体にインストールする方法
- プロジェクトごとそれぞれにインストールする方法
今回は「プロジェクトごとにそれぞれインストールする方法」を行う。
pipenv
を使うことによってこれが可能となり、
同じライブラリでもプロジェクトごとに異なるバージョンを利用できたり、
PC本体にインストールするわけではないので、他の人と共同開発するとき
「人によって使えないライブラリがある」といったことを防ぐことができる。
新しくライブラリを追加する場合
pandas
ライブラリをプロジェクト内にインストールする場合、次のように行う。
$ pipenv install pandas
すると、Pipfile
にpandasのライブラリ情報が記録される。
[[source]]
// 省略
[dev-packages]
// 省略
[packages]
pandas = "*"
[requires]
// 省略
追加されたライブラリは「パッケージ名 = “バージョン”」という形式で記録される。
今回は特にバージョンを指定していないため、*
(バージョンはなんでもよい)という記載になっている。
開発時だけ利用するライブラリを追加する場合
構文チェックを行うライブラリなどは、開発時は必要だが運用時には必要ないライブラリである。
このような「開発時だけあればよいライブラリ」は
下記のようにインストールすることで区別して扱うことができる。
例えば、pylint
というコードチェックツールをインストールするとき、
下記のように--dev
オプションを付与してインストールを行う。
$ pipenv install pylint --dev
すると、Pipfile
でもdev-packages
として記録される。
[[source]]
// 省略
[dev-packages]
pylint = "*"
[packages]
pandas = "*"
[requires]
// 省略
既に作成済みのプロジェクトの場合
他の誰かがプロジェクトを既に作成していてPipfile
にライブラリ情報が既に記載されている場合は、
以下のコマンドで必要なライブラリを一括インストールすることができる。
$ pipenv install
開発時のみ利用するライブラリ(--dev
を使ってインストールしたもの)
も含めてインストールしたい場合は、--dev
オプションを利用するだけでよい。
$ pipenv install --dev
既に作成されているプロジェクトでは、このコマンドを実行すれば
必要な環境構築は一気に終わる。
実行する
今回はmain.pyを実行したい状況とする。
$ ls
Pipfile main.py
また、分かりやすいように、
- PCにインストールされているPythonのバージョン:
2.7.16
- プロジェクト内で使われているPythonのバージョン:
3.8.5
とする。
$ python --version
Python 2.7.16
$ cat Pipfile
# 省略
[requires]
python_version = "3.8"
# 省略
pipenv
によるスクリプトの実行方法は2通り存在する。
pipenv
で作成される仮想環境に入って、python
コマンドからスクリプトを実行するPipfile
に実行用スクリプトを記載して、pipenv run コマンド名
で実行する
pipenvで作成される仮想環境に入って実行
pipenv shell
コマンドで、pipenv
が作成する仮想環境に入ることができる。
仮想環境内でpython --version
コマンドを使うと、pipenv
によって指定されたバージョンを利用することが確認できる。
# PCにインストールされているPythonのバージョン確認
$ python --version
Python 2.7.16
# 仮想環境に入る
$ pipenv shell
Launching subshell in virtual environment…
(current_dir_name)$
# ↑現在のディレクトリ名が表示されているはず
# 仮想環境内でPythonのバージョンを確認する
(current_dir_name)$ python --version
Python 3.8.5
# スクリプトを実行する(3系のPythonで実行される)
(current_dir_name)$ python main.py
Hello, World!
# exitで仮想環境から抜ける
(current_dir_name)$ exit
$
実行用スクリプトを作成して、pipenvコマンドから実行する
上記のように、PCにインストールされていない3系のPythonでスクリプトを実行したい場合、
仮想環境内のPythonコマンドから実行しなくてはいけない。
また、pipenv
によってインストールされたライブラリは
仮想環境内でしか使うことができない。
下記ようにPipfile内に[scripts]
を「実行キーワード=仮想環境内で実行するコマンド」
の形式で記載すればOK。
Pipfile
[[source]]
// 省略
[requires]
python_version = "3.8"
[scripts]
dev = "python main.py"
このように記載しておくとpipenv run 実行キーワード
で実行可能になる。
$ pipenv run dev
Hello, World!
npmを使ったことがある人ならば、同じ要領なので理解しやすいと思う。
まとめ
- プロジェクト内のPythonバージョンやライブラリ管理は
pipenv
で行う pyenv
はpipenv
内で利用されているが、あまり意識しなくて良い- Pipfileに実行用スクリプトを書いておくと、
pipenv run 実行キーワード
で実行できる