KATOエンジニヤリング開発日誌

「アウトプット無きエンジニアにインプットもチャンスも無い」の精神で書いています

Software-Design 2018年2月号のPythonライブラリの記事 1

2018年1月に発売された「Software Design 2018年2月号」のPythonライブラリの記事を読みました。

ソフトウェアデザイン 2018年 02 月号 [雑誌]

ソフトウェアデザイン 2018年 02 月号 [雑誌]

仕事でPythonを使うことが多く、使用するライブラリの仕組み等を理解していなかったので良い勉強になりました。

第1章 パッケージ管理の基礎を知ろう

Pythonライブラリのディレクトリ構成

Pythonのライブラリは大きく分けて次の3種類のディレクトリに格納される。

標準ライブラリディレクトリ

Pythonの標準ライブラリが格納されるディレクトリ。

~ $python3

>>> import datetime
>>> print(datetime.__file__)
/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/datetime.py
>>> import json
>>> print(json.__path__)
['/usr/local/Cellar/python3/3.6.3/Frameworks/Python.framework/Versions/3.6/lib/python3.6/json']

このディレクトリにはユーザが独自にパッケージをインストールすることはない。

site-packages ディレクトリ

サードパーティ製のモジュールが格納されるディレクトリ。システムの全利用者が利用するパッケージをインストールするディレクトリで、システム管理者が導入・アップデートの管理を行う。

pip install コマンドを実行すると、このディレクトリに格納されることになる。

~ $pip3 install twine
... 省略...
Installing collected packages: twine
Successfully installed twine-1.9.1
~ $python3

>>> import twine
>>> print(twine.__file__)
/usr/local/lib/python3.6/site-packages/twine/__init__.py

Unix系OSの場合、OSが提供するツールとしてPythonが利用されている。そのため、site-packagesディレクトリにインストールすると、OS提供のツールの動作やバージョンアップ時に問題が発生する可能性がある。可能な限り、後述するユーザ別のsite-packagesディレクトリや仮想環境にインストールして利用するようにした方が良い。

ユーザ別 site-packages ディレクトリ

サードパーティ製のモジュールを格納するディレクトリであるが、システム全体にインストールするのではなく、各ユーザが自由にインストールできるディレクトリ。

pip install --user コマンドを実行するとこのディレクトリに格納されることになる。

~ $whoami
masayuki_kato
~ $
~ $pip3 install --user twine
... 省略...
Installing collected packages: twine
Successfully installed twine-1.9.1
~ $python3

>>> import twine
>>> print(twine.__file__)
/Users/masayuki_kato/Library/Python/3.6/lib/python/site-packages/twine/__init__.py

Python開発の必須ツール

pip

Pythonパッケージのインストール・アンインストールを行うコマンドラインユーティリティである。Python2系のパッケージを管理する場合はpipコマンドを使い、Python3系のパッケージを管理する場合はpip3コマンドを実行する。

venv

Pythonで開発を行う際にはプロジェクト毎に独立した仮想環境を作成するのが一般的である。

仮想環境の作成

下記の要領で仮想環境のディレクトリを作成する。

Python $pwd
/Users/masayuki_kato/Python
Python $python3 -m venv ./test_env
Python $ls test_env/
bin     include     lib     pyvenv.cfg
仮想環境の切り替え

LinuxやmacOSでは下記の要領で仮想環境に切り替えることができる。

Python $source ./test_env/bin/activate
(test_env) Python $
仮想環境でのパッケージの扱い

仮想環境でpipコマンドによるパッケージインストールを行うと、仮想環境内にインストールされる。これは元の環境や他の仮想環境からは利用することができない。

# 仮想環境でpandasをpip3 install する
(test_env) Python $pip3 install pandas
... 省略...
Installing collected packages: six, python-dateutil, pytz, numpy, pandas
Successfully installed numpy-1.14.0 pandas-0.22.0 python-dateutil-2.6.1 pytz-2017.3 six-1.11.0
(test_env) Python $python3

# pandasをimportしてもエラーは発生しない
>>> import pandas
>>> quit()
(test_env) Python $deactivate
Python $python3

# 仮想環境を抜けた状態でpandasをimportするとエラーが発生する
>>> import pandas
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'pandas'

pipenv

pipenvはpipとvenvの両方の機能を持つユーティリティで、仮想環境の管理とパッケージのインストールを行うことができる。

pipenvではプロジェクト(仮想環境)毎にPipfileというファイルを作成して利用するパッケージを登録し、専用の仮想環境を自動的に作成してインストールすることができる。

# pipenvのインストール
Python $pip3 install --user pipenv
... 省略...
Successfully built pipenv virtualenv-clone
Installing collected packages: virtualenv, virtualenv-clone, pew, pyflakes, mccabe, pycodestyle, flake8, pipenv
Successfully installed flake8-3.5.0 mccabe-0.6.1 pew-1.1.2 pipenv-9.0.3 pycodestyle-2.3.1 pyflakes-1.6.0 virtualenv-15.1.0 virtualenv-clone-0.2.6

pipenvをインストールしたら、次はプロジェクトの作成を行う。

# プロジェクトの作成を行う
Python $mkdir proj1
Python $cd proj1/
proj1 $pipenv install

しかし、ここでエラーが発生した。pipenvコマンドがcommand not foundとなったので、一度pipenvをアンインストールした。後、pip3 install pipenvでコマンドでsite-packagesディレクトリにインストールし、再度プロジェクトの作成コマンドを実行したが、再び下記のエラーが発生した。

proj1 $pipenv install
Creating a virtualenv for this project…
Warning: it looks like pew is not in your PATH. We cannot continue until this is resolved」

エラー文をネット検索したらvirtualenvとpipenvとpewをアンインストールしろと書いてあったので、アンインストール後に再度 pip3 install pipenv コマンドでpipenvをインストールした。

stackoverflow.com

# pipenvを再インストール後にpipenv installを行う
proj1 $pipenv install
...省略...
Installing dependencies from Pipfile.lock (c23e27)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 0/0 — 00:00:00
To activate this project's virtualenv, run the following:
 $ pipenv shell
# Pipfileが作成されていることを確認する
proj1 $ls
Pipfile     Pipfile.lock

pipenv installコマンドでプロジェクトにパッケージを登録することができる。

proj1 $pipenv install dateutils
Installing dateutils…
...省略...

Adding dateutils to Pipfile's [packages]…
Locking [dev-packages] dependencies…
Locking [packages] dependencies…
Updated Pipfile.lock (fc4265)!

# インストールしたパッケージはPipfileに記録される
proj1 $cat Pipfile
[[source]]

url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"


[packages]

dateutils = "*"


[dev-packages]

pipenvでは開発環境のみで使用するパッケージを開発用パッケージとしてインストールしたり、updateコマンドで最新版に更新できたりする。