ドリフターズ

ニンニキニキニキ、ニンニキニキニキ

Python環境のインストール

Pythonの実行環境をインストールする手順について解説をします。

この方法は、どの環境でもおなじように操作できるよう、また、他のひととのコード共有をおこなうときに不具合がおこらないよう配慮しつつ、かつ最低限の手順で安定的に実行可能なように考えられている。

以下の原則をもとにしている。

  • Pythonの標準的な操作をもとにしている。
    • Anacondaを使わない。Anacondaは、歴史的にPythonのパッケージ管理などが、まだ未熟でそれらに対して議論が続けられていた時期にContinuum Analyticsが、それらの議論とは別に独自のルールに基づくパッケージシステムをつくりあげたことから始まっている。彼らは、ユーザに科学計算、データ分析などの彼らが必要と考えるライブラリを同梱し、All-in-Oneパッケージとして提供した。これによりユーザは、難しいパッケージ管理について、頭を悩ませる必要がなく、すばやくユーザの目的を達成することができるようになった。 しかし、それにより、また別の問題を抱えるようになった。Anacondaで提供していないライブラリを導入するには、Python標準のパッケージ管理システムであるpipを用いて、PyPIからそのパッケージを導入する必要があるが、そのパッケージが利用する依存関係が、Anacondaが管理するパッケージとバッティング、あとからインストールしたパッケージを上書きしてしまうなどで、システムの整合性が壊れてしまうようになってしまった。

そこで、Anacondaを利用するユーザ。とくに初心者には、pipでパッケージをインストールすることは、推奨しないというプラクティスが生まれてしまった。Anaconda自身は、大きなパッケージ管理しすてむなので、そこにないパッケージをわざわざpipで導入する必要が出てくることはないとはいえ、巷に出回っている情報(pipでライブラリをインストールする方法を解説しているものなど)から、pipでのインストールによって、自分の環境を壊してしまうことも多い。

また、今後、Pythonをもちいてサービス開発を目指す場合、その実行環境に毎回、大型のAnaconda環境を導入するのか?と言った問題やPythonの動作の仕組みを理解すること。さらにAnacondaというベンダーに依存して開発することの不自由さを考慮し、現在では十分に実用に足るパッケージ管理の仕組みが標準で提供されていることからもAnacondaを使う意味合いは、低下しているのではないかと考える。

  • OSの環境を汚さない。

    • OSの構成にPythonを使っているものがある。(macOSUbuntu)これらは、標準でPythonが同梱されているが、これらを使っていったとき、ライブラリのバージョンアップや入れ替えなどで、OSの動作に不具合が生じることがある。(事例?)そのため、標準インストールされているPythonとは、別にPythonをインストールし、それらを普段使いの環境とすることでOSに問題が生じないようにする。
  • どの環境でも同様に実行できるようにする。

これらのどの環境でも、同じ手順で環境の管理がおこなえることが望ましい。

Python実行環境のインストール

Pythonのインストールの際に、Anacondaを使わない場合、python.orgからインストーラをダウンロードしてインストールする手順で説明されることが多い。その場合、インストールされたバージョンは、python3.xといったディレクトリにインストールされることになる。そして、それらを利用する際には、対象のバージョンへのパスの指定や実行時に python3.x <スクリプト名>.py と言った形での実行やメンドイのであれば、pythonへのエイリアスの指定など、細々としたバージョンとパスの管理が必要になってくる。

そのため、 Pythonのインストールに際しては、Pyenvを用いることが最適解ではないかと考える。Pyenvのインストールについては、各OSで異なる手順が必要となるが、Pyenvインストール後の各種操作については、どのプラットフォームでも同じ手順を適用することが可能となるため、人に手順を伝えるときなども、環境依存を考慮しなくてもよくなる。

Pyenvのインストール

PyenvのGitレポジトリ

GitHub - pyenv/pyenv: Simple Python version management

すべてのPyenvの操作については、上記の公式に説明があるが、簡単に各OSへのインストールを解説する。

macOSへのインストール

macOSへのインストールについては、macOSでのデファクトになっているHomebrewを用いた方法でおこなう。

brew update # brew のパッケージリストを更新する
brew install pyenv # pyenvのインストール

以上で、pyenv コマンドが利用できるようになる。

pyenvが利用できるようになったが、つぎにpythonをインストールする前に依存関係のためのパッケージを事前インストールしておく必要があるため、先程同様、Homebrewで以下のようにインストールしておく。

brew install openssl readline sqlite3 xz zlib tcl-tk
WIindowsへのインストール

pyenvでは、WIndows 環境を公式にはサポートしていない。が、pyenvをフォークしたpyenv-winがある。

https://github.com/pyenv-win/pyenv-win

詳細な手順は、上記のpyenv-win公式を参照するべきだが、Power Shellからのインストール方法は、以下のとおり

Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1" # pyenv-winのインストール

# PYENV, PYENV_HOME, PYENV_ROOTの変数を追加
[System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")

[System.Environment]::SetEnvironmentVariable('PYENV_ROOT',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")

[System.Environment]::SetEnvironmentVariable('PYENV_HOME',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")

# pyenv利用のためのPATHの設定
[System.Environment]::SetEnvironmentVariable('path', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('path', "User"),"User")

以上で、PowerShell から pyenv コマンドが利用できるようになる。

各種Linuxディストリビューションへのインストール

Linuxに関しては、どのディストリビューション環境でもほぼ同じである。Gitでレポジトリを、~/.pyenvディレクトリにクローンするだけ。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv # pyenvを.pyenvディレクトリにクローンする

# 環境変数を設定する(例はbashの場合)
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

# シェルの再起動
exec "$SHELL"

以上で、pyenv コマンドが利用できるようになる。

pyenvが利用できるようになったが、つぎにpythonをインストールする前に依存関係のためのパッケージを事前インストールしておく必要があるため、以下のようにインストールしておく。(Debian, Ubuntuの場合)

sudo apt-get update; sudo apt-get install make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev

Linux環境については、それぞれのディストリビューションごとに依存パッケージがことなるため、下記URLから、それぞれにあったディストリビューションの依存パッケージをインストールするように注意

https://github.com/pyenv/pyenv/wiki#suggested-build-environment

Pythonのインストール

以上で、pyenvの準備がととのったとして、Pythonのインストールを行っていく。

どのOS環境でもpyenvによる操作は、同じである。一連の操作は、以下の通りおこなう。

# Pyenvのインストールされている場所とバージョンを確認
which pyenv # WIndowsの場合は、動作しないので注意
pyenv --version

# 現在インストールされているPythonのバージョンとどのPythonがデフォルトで利用されているか確認
pyenv versions
pyenv which python3.3
python --version

# それでは、インストールを実施

pyenv install --list # インストール可能なPythonの一覧を確認
pyenv install 3:latest # Python 3.xの最新バージョンをインストール
pyenv versions # 現在インストールされているPythonのバージョンを確認
pyenv global 3.x.x # インストールしたバージョンのPythonを利用バージョンとして選択する
pyenv versions # デフォルトで利用のバージョンが変更されているか確認
python --verion # pyenvで設定したバージョンとおなじかどうかをpythonコマンドから確認
which python # どこにインストールされたPythonが利用されるかの確認

以上で、Pythonのインストールは完了。あらたにインストールされたバージョンがデフォルトで利用される。

Pythonを利用する

Pythonを利用するには、仮想環境で利用するように習慣づける。なぜなら、今後、他の人とコードを共有する場合や、試行錯誤をしていく場合にさまざまなパッケージのインストール、アンインストールを行うことになるが、依存関係などがわかりにくくなってしまわないように、特定の作業ディレクトリ内で完結した環境を作成して利用したほうが、のちのちトラブルになりにくい。

そのため、以下のように仮想環境を用意する。仮想環境とはいっても、実質、ただのディレクトリでその中にPythonやpipのエイリアスを作成しているだけである。追加でインストールするパッケージか、そのディレクトリ内にインストールされることになり、仮想環境利用中はディレクトリ外のパッケージは参照されないので、安全に管理できる。

# 作業用ディレクトの作成
mkdir {project}
cd {project}

# 事前に環境の確認
whcih python
python -m pip list

# 仮想環境の作成と確認
python -m venv .venv # 仮想環境の作成
source .venv/bin/activate # 仮想環境の有効化
which python # 仮想環境の内のPython コマンドが参照されていることを確認
python -m pip isntall pip-install-test # テスト用にパッケージをインストールしてみる
python -m pip list # パッケージがインストールされたことを確認
decativate # 仮想環境の無効化
python -m pip list # インストールしたパッケージが存在しないことを確認。これは、仮想環境を無効化したために別のpipが管理している情報を参照しているため。
source .venv/bin/activate # 再度、仮想環境の有効化
python -m pip list # ふたたびパッケージが存在していることが確認できる
python -m pip unisntall pip-install-test # 確認できたので、パッケージのアンインストール
python -m pip list # パッケージがアンインストールされたことを確認
decativate # 仮想環境の無効化

以上の操作でだいたいの仮想環境の動作は、わかったと思うので、以降、Pythonスクリプトを書く際には、仮想環境での操作を推奨する。

Pyenv やめたい...

以下のとおり、pyenvのディレクトリと環境変数の削除でクリーンアップされます。

rm -rf $(pyenv root)
# ~/.bashrcに登録した、以下の環境変数を削除します。
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

宿題

  • Pyenv-virtualenvがあるが、venvと比較しての有効性、メリット
  • Pyenvを使わずに、バージョン管理するシンプルな方法
  • パッケージ管理をPipenvで行う方法

qiita.com