- Published on
Pythonのバージョン管理をする方法とpyenvの使い方
- Authors
- Name
- Shou Arisaka nyapp.buzz/shou
- short bio
- Z世代の情報技術者。Next.jsで自作SNSを個人開発中。
Pythonやプログラミング言語では、使用するライブラリやフレームワーク、依存関係との互換性に合わせて、複数のバージョンをサイドバイサイドでインストールしておく必要に迫られる場合が多々あります。そのような場合に活用できるのが、"バージョン管理ツール"、"バージョンマネージャー"などと呼ばれるもので、Python言語では"pyenv"がそれにあたります。
Ubuntu 16.04にpyenvをインストールしてPythonのバージョン管理を可能にしてみましょう。Ubuntu18.04、WSLでも同様に可能です。
インストールします。
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
~/.bashrc
へ追記します。
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
ここで注意があります。以下の通り、echo $BASH_ENV
にて~/.bashrc
が出力されるようであれば、~/.bashrcへ上記コードを追記するのはやめたほうがいいらしいとのことです。その代わりに、~/.bash_profile
へ追記をします。
僕の環境では~/.bash_profile
は作っておらず、またBASH_ENV
も未定義であったので、無視して.bashrcへ追記をして使っていますが、問題は出ていません。
General warning: There are some systems where the BASH_ENV variable is configured to point to .bashrc. On such systems you should almost certainly put the abovementioned line eval "$(pyenv init -)" into .bash_profile, and not into .bashrc. Otherwise you may observe strange behaviour, such as pyenv getting into an infinite loop.
再起動します。
bash
以下の通り、Pythonをpyenvでインストールする前に、依存関係のプログラムをインストールしてくれとあります。
Install Python build dependencies before attempting to install a new Python version.
Python環境がすでにある方は問題ないかと思いますが、Python自体インストールしていないという方はこれらをインストールしておく必要がありそうです。 実際に検証していませんが、だいたい以下のコードを実行しておけば問題ないかと思います。
sudo apt-get install -y python3-pip python3-dev # for Python 3.n
pip3 install --upgrade pip
以下で任意のバージョンのPythonをインストールできます。
pyenv install 3.6.7
pyenv install 2.7.12
pyenv global
で使用するPythonのバージョンを指定します。これで、自動でpython
やpython3
コマンドがpyenvにオーバーライドされたことになります。
$ pyenv global 2.7.12 3.6.7
$ pyenv versions
system
* 2.7.12 (set by /Users/yyuu/.pyenv/version)
* 3.6.7 (set by /Users/yyuu/.pyenv/version)
$ python --version
Python 2.7.12
$ python2.7 --version
Python 2.7.12
$ python3.6 --version
Python 3.6.7
pyenvでバージョンを変更する前には失敗していたコマンドが…
$ python3 --version
Python 3.5.2
$ epy 'regex_match("hoge","hoge")'
File "/mnt/c/pg/epy.py", line 28
if ( re.match(rf"{regex}", text, re.M) ) : return True
^
SyntaxError: invalid syntax
エラーなく成功するようになりましたね。
$ python3.6 --version
Python 3.6.7
$ python3 --version
Python 3.6.7
$ epy 'regex_match("hoge","hoge")'
$
15歳でWordPressサイトを立ち上げ、ウェブ領域に足を踏み入れる。翌年にはRuby on Railsを用いたマイクロサービス開発に着手し、現在はデジタル庁を支えたNext.jsによるHP作成やSaaS開発のプロジェクトに携わりながら、React.js・Node.js・TypeScriptによるモダンなウェブアプリの個人開発を趣味でも行う。
フロントエンドからバックエンドまで一貫したアジャイルなフルスタック開発を得意とし、ウェブマーケティングや広告デザインも必要に応じて担当、広告運用・SEO対策・データ分析まで行う低コストかつ高品質な顧客体験の提供が好評。
国内外から200万人を超える人々に支えられ、9周年を迎えるITブログ「yuipro」の開発者、デザイナーでありライター。現在ベータ段階の自作SNS「nyapp.buzz」を日本一の国産SNSとするべく奮闘中。