皆さまこんにちは、ウチイダです。

Python/Djangoの案件にかかわることになりそうで、改めて勉強しなおそうと思っています。

Djangoはチームの開発で使ったことがなかったので、これを機に周辺ツールの知識もまとめておくことにしました。

ウチイダの作業環境は以下です。

  • Windows 11 21H2
  • WSL2 Ubuntu20.04
  • GNU bash, version 5.0.17(1)-release (x86_64-pc-linux-gnu)

以降の内容は、この環境にPython/Djangoの開発環境を導入していく手順メモとなります。

まずはPythonのバージョン管理ツールから

何はともあれ、ランタイムのバージョン管理を入れることにします。

Node.js のnodenv やvolta とか、PHP のphobrew みたいなものを探してみます。

調べたところ、pyenv がよくつかわれているようです。

https://github.com/pyenv/pyenv

anyenv にも含まれているツールです。rbenv をフォークしてPython 用にしたものだとのこと。

メンテナンスも継続されてるようなので、pyenvを使うことにしました。

インストールする

未来の自分が別の環境でコピペ利用できるように、なるべく汎用的なやり方にしておきます。

GitHubのREADMEに情報がまとまっているので、これに沿って進めれば大丈夫そうです。

https://github.com/pyenv/pyenv#basic-github-checkout

GitHub のリポジトリをクローンする方法で進めます。

READMEに書いてあるのそのままですが、実行するコマンドと出力結果例は以下です。

以下のコマンドをコピペで大丈夫だと思うのですが、いくつか留意すべき点があります。

# 1. リポジトリをclone する
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Cloning into '/home/y-uchiida/.pyenv'...
remote: Enumerating objects: 22214, done.
remote: Counting objects: 100% (282/282), done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 22214 (delta 141), reused 237 (delta 112), pack-reused 21932
Receiving objects: 100% (22214/22214), 4.49 MiB | 4.40 MiB/s, done.
Resolving deltas: 100% (15003/15003), done.

# 2. 高速化のためのBash拡張のコンパイル(やらなくてもOK)
$ cd ~/.pyenv && src/configure && make -C src
make: Entering directory '/home/y-uchiida/.pyenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/pyenv-realpath.dylib  -o ../libexec/pyenv-realpath.dylib realpath.o
make: Leaving directory '/home/y-uchiida/.pyenv/src'

# 3-1. ~/.bashrc にpyenv の設定を追加(pyenv がデータを保存するディレクトリを指定)
$ echo "#setting for pyenv" >> ~/.bashrc
$ 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

# 3-2. 同じ内容を、 ~/.bash_plofile にも追加する
$ echo "#setting for pyenv" >> ~/.bash_profile
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

# 4. 設定を読み込み
$ source ~/.bashrc

# .5 pyenv が実行できれば完了!
$ pyenv -v
pyenv 2.3.6-15-g13d85686

補足・留意点

1. Bash 設定ファイルについて

上記コマンドの中で、.bashrc と.bash_profile にpyenv の設定を追加していますが、READMEによると$HOMEにあるbashの設定ファイル全部に書いとくと安心、とのことです。

ウチイダは自身の$HOME ディレクトリに上記の2つだけしか存在してなかったので、これだけ設定しています。

人によっては .profile とか、.bash_login があるかもしれないので、その場合は同じように追記しておくとよさそうです。

2. $BASH_ENV 環境変数について

$BASH_ENV が .bashrc に設定されてる場合の注意点が記載されてます。

この場合、eval “$(pyenv init -) を .bashrc に記述しておくと、pyenv が無限ループを起こしてしまうとのこと…

echo $BASH_ENV で設定値を確認して、もし.bashrc になっていたら、eval の行は .bashrc から取り除いておきます。

pyenv でPythonをインストール

いくつかの罠を越えてpyenv をインストールできたら、さっそく使っていきましょう。

# 1. インストール可能なバージョンの一覧を表示
$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4.0
# ... 以下略

# 2. バージョンを指定してインストール(3.10.x)
$ pyenv install 3.10
Downloading Python-3.10.8.tar.xz...
-> https://www.python.org/ftp/python/3.10.8/Python-3.10.8.tar.xz
Installing Python-3.10.8...
Installed Python-3.10.8 to /home/y-uchiida/.pyenv/versions/3.10.8

# 3. デフォルトで動作するバージョンを設定
$ pyenv global 3.10
$ python --version
Python 3.10.8

# 4. 現在のディレクトリで動作するバージョンを指定
$ pyenv local 3.10

pyenv local は、実行したディレクトリに.python-version というファイルを作って、そこに利用するバージョンを書き込んでいます。

.python-version ディレクトリ階層をみて、直近の上位ディレクトリの.python-version に記載されたバージョンを使ってくれます。

そのほかの使い方は、pyenv –help を実行すると詳しく出てきます。

まとめ

pyenv を導入して、バージョン切り替えできるようにしました。

これで万が一、複数バージョンが必要になった場合も安心です。

それにしても、Pythonってサポート期間長いんですね…どのバージョンも5年ある…

ライブラリも、過去バージョンのサポートを長めに続けているようなので、意外とプロジェクトごとに厳密にバージョン分けする機会ってないのかも…と感じてます。

本当にきっちりやるなら、Dockerとか仮想マシン使うでしょうし…

とはいえ、pythonに限らないですが、OSの公式リポジトリだと最新バージョンをインストールできない場合も多いです。

気軽に最新バージョンに追従できるようにしておくのは悪くなんじゃないかと思います。

以上です。あなたのお役に立てればうれしいです。