This page looks best with JavaScript enabled

プログラミング環境構築【Python編】

 ·   ·  ☕ 8 min read  ·  ✍️ Reeve
    🏷️

今回はPythonの開発環境構築について書いてみる。
一応、Pythonは現在メインで使用している言語であり、様々な環境を試してみた結果、個人的に使いやすいと思った環境を紹介したい。

ここでは、Ubuntu18.04LTSでの環境構築を扱うものとする

この記事の内容

  • pyenv/pyenv-virtualenvの導入
  • パッケージ管理ツールPoetryの導入

Python環境構築の前提の話

一番わかりにくいというか、混乱の原因となっているのが、Pythonの環境構築は様々な方法が存在していることだと思う。

そもそも、最もベーシックなPython環境構築としてはaptを使用した方法がある。
Ubuntu18.04LTSの場合、これは最初からインストールされていると思う。
MacOSの場合はhomebrewを使った方法だろうか (Macほとんど使ったことないのでよくわかっていない)。

1
2
3
4
5
# Python2系の場合
sudo apt install python

# Python3系の場合
sudo apt install python3

OSのシステムに関連するPythonコードを実行するには特に問題はないが、自分でコードを作成する場合にこのPython環境を使用するのは適切ではない。
理由は以下の通り。

  • 仮想環境を作成できないため、面倒なトラブルに陥る可能性が高い
  • Pythonのバージョンを自由に変更できない

少しでもPythonを触ったことがある人ならわかると思うが、Pythonパッケージのインストール・アンインストールを繰り返していると、バージョンの依存関係が狂ってにっちもさっちも行かなくなることがある。
そのため、上記の環境に自分でパッケージをインストールすることはおすすめしない。

以上のデフォルト環境にパッケージをインストールしていくことは非常にリスクが高い。
したがって、Pythonでの開発環境には仮想環境を構築できるものが必須となる。
(仮想環境であれば、おかしくなった環境も削除してしまえばまたやり直せる。)

一番有名なのはAnacondaだと思う (私も最初はこれを使っていた)。


特にこだわりがなければ、正直Anacondaを入れておけば十分な気もする (割と本気)。
GUIで仮想環境を作れたり、パッケージをインストールできたりと色々やりやすい。
が、これだけだと記事が終わってしまうので、一応デメリットも挙げておく。

  • condaコマンドだけではインストールできないパッケージも多い
  • pipとconda両方で同じパッケージをインストールすると挙動が怪しくなる
  • ディレクトリ毎に仮想環境を設定できない

これらの理由から、私はAnacondaを使うのをやめた。
そして私は現在はpyenvを使用している。
他にも方法はあると思うが、割と納得いく環境となっている。
(少し前まではPyTorchなどcondaを使わないと入れるのが大変なパッケージもあったが、最近はかなり減っていると感じている。)

pyenvとpyenv-virtualenvの導入

インストール

早速pyenvを導入していく。
同時に仮想環境を作成するプラグイン、pyenv-virtualenvも導入する。
まず、以下のコマンドを実行し、リポジトリをcloneする。

1
2
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

次に、.profileもしくは.zshenvに以下の記述を加える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
if command -v pyenv 1>/dev/null 2>&1; then
    eval "$(pyenv init -)"
fi
eval "$(pyenv virtualenv-init -)"

if [[ -n $VIRTUAL_ENV && -e "${VIRTUAL_ENV}/bin/activate" ]]; then
    source "${VIRTUAL_ENV}/bin/activate"
fi

その後、ターミナルの再起動もしくはsourceコマンドで再読込をする。
以下のコマンドで、pyenvのバージョンを表示できればOK。

1
2
pyenv --version
> pyenv 1.2.16

任意のバージョンのPythonをビルド

次に、好きなバージョンのPythonをビルドする。
ちなみにビルドできるバージョンは以下のコマンドで確認できる。

1
pyenv versions

今回は例として、3.7.6をビルドしてみる。
以下のコマンドを実行する。
インストールには少し時間がかかる。

1
CONFIGURE_OPTS="--enable-shared" CFLAGS="-fPIC" pyenv install 3.7.6

ビルド時に上記のオプションを指定しないと色々なところでハマる。
(確かOpenCVとか使うときに問題が起きた気がする。昔のことだから覚えていない…)

ビルドが完了したら、デフォルトで使用するPythonバージョンとして指定する。
pyenvには使用するPythonバージョンを指定する方法としてgloballocalの2通りの方法がある。
globalではデフォルトとして使用するバージョンを指定でき、localではそのディレクトリで使用するバージョンを指定できる。

先ほどビルドした3.7.6をデフォルトのバージョンに指定する。

1
pyenv global 3.7.6

確認してみる。

1
2
python -V         
> Python 3.7.6

このように表示されればOK。

仮想環境の作り方

次に仮想環境を作成していく。
作るのは非常に簡単。
先ほどビルドしたバージョン3.7.6を利用して、sampleという名前の仮想環境を作成してみる。

1
pyenv virtualenv 3.7.6 sample

作成したら、この仮想環境を使用したいプロジェクトのディレクトリで以下のコマンドを実行。

1
pyenv local sample

これで、このディレクトリ内では仮想環境sampleを利用できるようになる。
ちなみに一時的に特定の仮想環境を使用したい場合は以下のコマンドを使えば良い。

1
2
3
4
# 仮想環境に入る
pyenv activate sample
# 仮想環境を抜ける
pyenv deactivate

Poetryの導入

ここからはパッケージ管理ツールのPoetryを導入していく。


Poetryはパッケージ管理ソフトであり、パッケージの依存関係管理の役割を担う。
Poetryはそれにプラスして、パッケージのビルドやパブリッシュなども行うことができる。

似たようなソフトにはPipenvPyflowなどが存在する。
これら他のソフトは使用したことがないので比較は行わないが、Pipenvはビルドやパプリッシュなどは行うことはできない、Pyflowはより高機能でPythonバージョンの管理もできるが発展途上のため情報が少ない、という理由からPoetryを使用している。
Pythonバージョンの管理については前述のpyenv-virtualenvで実現しているため、組み合わせて使用すれば特に問題はない。

インストール方法

こちらもインストールはお手軽。

1
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python

以下のコマンドでバージョンが表示されればOK。

1
2
poetry --version
> Poetry version 1.0.5

もしpoetryコマンドが実行できない場合は.profileもしくは.zshenvに以下の記述を加える。

1
export PATH="$HOME/.poetry/bin:$PATH"

コマンド補完の導入

Poetryはシェルのコマンド補完を簡単に設定することができる。
環境によって異なるが、以下のコマンドを実行するだけ。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Bash
poetry completions bash > /etc/bash_completion.d/poetry.bash-completion

# Bash (Homebrew)
poetry completions bash > $(brew --prefix)/etc/bash_completion.d/poetry.bash-completion

# Fish
poetry completions fish > ~/.config/fish/completions/poetry.fish

# Fish (Homebrew)
poetry completions fish > (brew --prefix)/share/fish/vendor_completions.d/poetry.fish

# Zsh
poetry completions zsh > ~/.zfunc/_poetry

# Zsh (Homebrew)
poetry completions zsh > $(brew --prefix)/share/zsh/site-functions/_poetry

これでコマンド補完が効くようになる。

プロジェクトの作成

Poetryはpyproject.tomlpoetry.lockの2つのファイルでプロジェクトを管理している。
このうち、実際に操作するのはpyproject.tomlのみで、poetry.lockについては適宜自動で更新される。

まずはプロジェクトを作成したいディレクトリで以下のコマンドを実行する。

1
poetry init

すると、対話形式でプロジェクトの設定を聞かれるので、順番に入力していく。

  • Package name : パッケージの名前
  • Version : バージョン
  • Description : パッケージの概要
  • Author : 開発者名
  • License : ライセンス
  • Compatible Python versions : Pythonのバージョン

その後、依存パッケージのインストールについて聞かれるが、今は設定する必要がないので、2回Noと答える。
最後にDo you confirm generation?と確認されるので、Yesと答える。
これでプロジェクトが出来上がった。

パッケージのインストール

プロジェクトにパッケージをインストールしていく。
このとき、pyenv localで仮想環境に切り替えておくと、その仮想環境にパッケージがインストールされる。
パッケージのインストールは以下のコマンドを実行すれば良い。

1
2
3
4
5
# numpyをインストール
poetry add numpy

# matplotlibをインストール
poetry add matplotlib

上記コマンドでパッケージをインストールすると、pyproject.tomlにもそのパッケージが追加される。
その際、インストールしたパッケージのバージョンや依存パッケージのバージョンなどがpoetry.lockに自動で記載される。

これにより、自分で利用するために明示的にインストールしたパッケージと2次的にインストールされた依存パッケージなどをわけて管理できている。
そのため、アンインストールしたい場合は以下のコマンドを実行すると、その依存パッケージも含めてアンインストールされる。

1
2
# matplotlibをアンインストール
poetry remove matplotlib

また、Poetryで管理されているプロジェクト(pyproject.tomlpoetry.lockが含まれているディレクトリ)を外部から取得した場合、以下のコマンドを実行することで必要なパッケージをまとめてインストールできる。

1
poetry install

これでPoetryの基本的な使い方は一通り説明した。
パッケージをPyPIなどに公開する際のビルドやパブリッシュなどもPoetryから行えるが、このあたりの話は後日別途紹介したい。

まとめ

今回の記事では、pyenv/pyenv-virtualenvとPoetryを使ったPython開発環境構築について説明した。
パッケージの公開に関する話やエディタ環境に関する話には触れることができなかったので、別途記事を書きたいと思っている。

Share on

Reeve
WRITTEN BY
Reeve
Researcher/Engineer