見出し画像

[5分でできる] 1台のMacBookで、Python 2系とPython 3系を同時に動かす方法

生き急いでいるひとは、[pyenvのインスコ][pyenvを使ってPython2.7と3.7をインスコ] の章だけを読んでね。(° ꈊ °)✧˖°オホッ!

■ 姉さん、Python 2系がご臨終でした。

Catalinaさんになってもまだなお、MacOSに標準でインスコされているPythonさんはバージョン2.7。Macにデフォでインスコされちゃってるもんだから、Pythonでスクリプト作って自動化してみよー、この作業、あははー!みたいな軽い気持ちで作ったスクリプツがまさかのそのまんま、鯖の上で動いてたりして、拙者の中ではまだまだ圧倒的人気のPython 2系!

だけど・・・知ってました? Python 2系は2020年1月1日をもって、ご臨終されておるのです。サンセットですよ、日没!没!どうりで、鯖でスクリプト動かすとき、2系はイヤん♡的な警告を受けるわけだわ。だからみんな、新しくスクリプツをつくるときは、3系だよ!

新しいスクリプツはもはや 3系で書かざるを得ない。ただ・・・既存のスクリプツまでも、3系にウプデするのか、しないのか問題。やだやだやだ!やりたくない!だって 3系に移植する時間とかないもん!なくなったライブラリが判明しちゃうし、動かないコードが露呈しちゃうもん!超絶苦労して入れ替えても、処理結果は変わらないし、誰からも感謝されないもん!

となると・・・メンテは 2系、新しいのは 3系、ってなるね。アッチはこのバージョンだけど、コッチはそのバージョンで、えぇえええええ!で、結局何!?どのバージョンをインストールすればいーんすか!?拙者、貧乏人ゆえ、MacBookは1台しかもってまへんねんわ!みたいな、そうゆう事態に陥ってしまうま。

というわけで、拙者、Pythonの複数バージョンを同時に操れる、イケてる環境を調べてみたYO。無事手にいれられたので、記事にしちゃお。

■ Python環境分離でよく使われる方法

Pythonの環境分離で、拙者のまわりでよく使われている方法は3つ。

venv または virtualenv (読み方: バーチャルエンブ) を使う

Python界の環境分離ツールとしては、デファクトスタンダード。もともとは、virtualenvというサードパーティのツールだったが、Python 3.3ではvenvという名前で本家に取り込まれた。ゆえに、デファクトスタンダード。特定のバージョンに対して、特定のライブラリだけインストールできる。バージョン切り替えというよりは、ライブラリ切り替え。特定のライブラリだけ切り替えができるので、ミニマムなインストール容量で環境を切り替えられる。けど、切り替え時のコマンドが、だいぶ独特。Pythonist(読み方: パイソニスト、Pythonをこよなく愛しPythonを使いこなすプログラマーの意)であればモーマンターイだろうけど、RubyやNode.js等の他の言語の環境分離ツールに馴染んできたひとにとっては、少々とっつきにくい感は否めない。という完全に個人的な感想。

□ pyenv (読み方: パイエンブ) を使う

ニッポン(というかQiita)で圧倒的記事数を誇る、環境分離ツール。ただし、「pyenvサイコー!さぁみんな早くpyenvをインストールするのだ!」みたいなオヌヌメ記事を書くと、生粋のPythonistたちから「は?なに言っちゃってんの?Pythonの環境分離ツールは、venv(virtualenv)こそがPython環境分離ツールのデファクトスタンダードっしょ!世界的にはvenv(virtualenv)こそが主流!」という反論をもれなく食らう。

特定のライブラリではなく、すべてのライブラリをごっそり切り替える方式。ホームディレクトリ(任意で変更も可)配下に複数のPythonバージョンをインストールし、作業ディレクトリの単位でPythonのバージョンを指定できる。カレントディレクトリ、または親ディレクトリに、".python-version" という隠しファイルがある場合は、そこに記載されているバージョンが優先される動き。実行環境を変更するときに使うコマンドは、RubyやNode.jsの環境分離ツールの切り替えコマンドの操作と似てる。個人的には、一気に全部切り替わったほうが、スッキリ感があってすき。

□ Docker (読み方: ドッカー) または仮装環境を使う

PythonのコードをDocker等のコンテナ、仮装環境内で動かすように構成する方法。サーバーでの実行環境が既にコンテナ化されている、あるいはしようとしているなら、とても相性がイイ方法。Dockerの場合、必要なPythonのバージョンやライブラリはDockerfileで定義され実行される。サーバー上での実行環境と完全に同じ環境で開発できる、すげーやつ。

■ どれを使うのがベストか?

Webアプリ開発のPython実行環境切り替えなら、Dockerのようなコンテナあるいは仮装環境を選択したほうが、圧倒的に良い。超絶おぬぬめ。

ライブラリ開発者なら、Pythonistだろうから、たぶんvenv(virtualenv)一択。だってPython界のデファクトスタンダードですもの。

迷うのは、拙者のような、別にPythonistじゃねーけど、バッチ処理とかのスクリプツでちょいちょいPythonを使う必要があるひとびと。その他のひとびと。Dockerはちょっとやりすぎ感あるからないにしても、venvにするか、pyenvにするかで迷うところ。まぁいろいろ調べてはみたものの、ザッツ、ケイオス!

結論。その他のひとびとは、すきなものを使えばよし。自分にとって使いやすいものを使えばよし。ただし、使うと決めたら、ちゃんと自分で自分のケツをぬぐうべし。それがどんな動きをするのか、どこにファイルをつくっているのか、何に影響するのか、っていうことをちゃんと理解して使うべし。

というわけで拙者、pyenvを使うことに決めますた。だって拙者、特定のライブラリじゃなくて、全ライブラリをゴッソリ入れ替えたいんだもん。

■ pyenv準備運動1: XCodeのインスコ

ターミナルを起動して、カタカタカタカタ・・・ッターン! 

$ xcode-select --install

■ pyenv準備運動2: homebrewのインスコ

Macユーザーにはおなじみ、homebrew (読み方: ホームブリュー)をインスコするアル。

ターミナルを起動して、カタカタカタカタ・・・ッターン!まずは、homebrewがインスコされているのか、お調べあそばせ。

$ which brew
/usr/local/bin/brew

↑みたいな結果が返ってこなければ、このコマンドでインスコ。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

■ pyenvのインスコ

準備運動がぜんぶ完了したら、ターミナルを起動して、カタカタカタカタ・・・ッターン!

$ brew install pyenv

おわり。こんだけ。これで "pyenv" のインストール終了。はい簡単。

でもこの状態だと、まだPythonコマンドのPATHがOSデフォの方を向いてて、pyenvで設定するほうを向いてくれてない。こんなふうに。

$ which python
/usr/bin/python

ゆえに、pyenv用のシェル環境設定、ドドスコ、ドドスコ!

□ シェル環境設定更新(bashの場合)

$ echo 'export PYENV_ROOT=$HOME/.pyenv' >> ~/.bash_profile
$ echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.bash_profile
$ source ~/.bash_profile

シェル環境設定更新(zshの場合)

➜ ~ echo 'export PYENV_ROOT=$HOME/.pyenv' >> ~/.zshrc
➜ ~ echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.zshrc
➜ ~ source ~/.zshrc

これで、PythonのPATHがpyenvで制御するほうを向いてくれる。

$ which python
/Users/w0o0ps/.pyenv/shims/python

(° ꈊ °)✧˖°オホッ!

■ pyenvでよく使うコマンドオプション

pyenvで使えるおぷちょんはこんな感じ。

$ pyenv --help
Usage: pyenv <command> [<args>]

Some useful pyenv commands are:
  commands    List all available pyenv commands
  --version   Display the version of pyenv
  commands    List all available pyenv commands
  exec        Run an executable with the selected Python version
  global      Set or show the global Python version
  help        Display help for a command
  hooks       List hook scripts for a given pyenv command
  init        Configure the shell environment for pyenv
  install     Install a Python version using python-build
  local       Set or show the local application-specific Python version
  prefix      Display prefix for a Python version
sed: RE error: illegal byte sequence
  rehash      Rehash pyenv shims (run this after installing executables)
  root        Display the root directory where versions and shims are kept
  shell       Set or show the shell-specific Python version
  shims       List existing pyenv shims
  uninstall   Uninstall a specific Python version
  version     Show the current Python version and its origin
  version-file   Detect the file that sets the current pyenv version
  version-name   Show the current Python version
  version-origin   Explain how the current Python version is set
  versions    List all Python versions available to pyenv
  whence      List all Python versions that contain the given executable
  which       Display the full path to an executable

See `pyenv help <command>' for information on a specific command.
For full documentation, see: https://github.com/pyenv/pyenv#readme

拙者のなかで、圧倒的によく使うコマンドおぷちょんは、5つぐらいざんす。

□ インスコできるPythonバージョンの一覧を取得

$ pyenv install --list

□ ローカルのpyenv環境に特定のバージョンPythonをインスコ

$ pyenv install <"pyenv install --list"で取得したPythonのバージョンをひとつ指定>

□ ローカルにインスコされているPythonバージョン一覧を取得

$ pyenv versions

□ デフォで使うPythonのバージョンを指定

$ pyenv global <"pyenv versions"で取得したPythonバージョンのひとつを指定>

カレントディレクトリで使うPythonバージョンを固定

$ pyenv local <"pyenv versions"で取得したPythonバージョンのひとつを指定>

■ pyenvを使ってPython2.7と3.7をインスコ

拙者、OSデフォのグローバル環境はデキる限り汚染したくないマンなゆえ、あえて、MacOS に標準搭載な Python 2.7もpyenv環境にインストールして、デフォ設定しちゃう。

$ pyenv install --list | grep 2.7.15
 2.7.15
$
$ pyenv install 2.7.15
$
$ pyenv versions    # インストールできたバージョンを表示, *印がついているのが現在選択されているPython環境
* system (set by /Users/w0o0ps/.pyenv/version)   # OSに標準搭載のものが有効になっている
 2.7.15
$
$ pyenv global 2.7.15   # デフォで使うPythonをpyenvでインストールしたものに変更
$
$ pyenv versions
  system
* 2.7.15 (set by /Users/maasa/.pyenv/version)    # *印が移動した!
$
$ python --version
Python 2.7.15       # Pythonコマンドで見えるバージョンも期待通り

続けて Python 3.7 もインストールしちゃう。

$ pyenv install --list | grep 3.7.0
 3.7.0
 miniconda-3.7.0
 miniconda3-3.7.0
$
$ pyenv install 3.7.0
$ 
$ pyenv versions
 system
* 2.7.15 (set by /Users/maasa/.pyenv/version)
 3.7.0
$ 

あとは、Python 3系で動かしたいスクリプツのディレクトリに移動して、Pythonのバージョンを宣言するだけ。

$ cd ~/Workspace/python3-scripts
$ 
$ python --version
Python 2.7.15          # まだデフォのバージョンが有効になっている
$ 
$ pyenv local 3.7.0    # pyenvでインストールした3系のバージョンに変更
$ 
$ python --version
Python 3.7.0           # 3系のバージョンが有効になっている
$ 
$ ls -alh | grep ".python-version"
-rw-r--r--   1 w0o0ps  staff     6B Feb 21 13:17 .python-version
$ 
$ cat .python-version
3.7.0
$ 

"pyenv local <version>" でバージョンを指定すると、カレントディレクトリに ".python-version" というファイルが作られて、そこに指定したPythonのバージョンが記載されてます。

これで、Python2系も、3系も、ディレクトリ分ければ、完全に分離して動かせるざます。(° ꈊ °)✧˖°オホッ!

この記事が気に入ったらサポートをしてみませんか?