試纏

ためしてまとめる〜色々なトピックやテーマについて試してみたり、まとめてみたりするブログです。

Pythonの実行環境をmacOS Sierra環境で整えつつIntellij IDEAとの連携設定も行う手順のまとめ

色々学習したい事を実現する為にPythonの実行環境を整えるのと併せて、折角ならば開発環境としてもちゃんと整備しておきたい、効率的にコーディングしたいという事で手持ちの環境(Intellij IDEA Ultimate Edition)と統合して行こうじゃないか、という事で当エントリの内容を纏めるに至りました。

実現したいこと

  • 新調したMacbook(無印:macOS Sierra)にPythonの実行環境をpyenvとvirtualenvとpyenv-virtualenvで綺麗に揃え、整えたい
  • Python2.7系/Python3.x系/その他各種分析・機械学習用のライブラリを適宜切り替えて使いたい
  • 切り替えた環境をIntellij IDEA(Ultimate Edition)の環境と連動させてIDE上でPythonコードをがしがし書いて行きたい

参考情報

以下の各種エントリを大いに参考にさせて頂きました。ありがとうございます。

実践手順

事前準備・作業前の状況

導入する環境は買ったばかりのMacbook無印 OS:macOS Sierra。 Pythonについては初期状態で下記のバージョンのものが導入されていました。

$ python --version
Python 2.7.10

Gitについても購入時点の環境で下記バージョンのものが導入済の状態。

$ git --version
git version 2.10.1 (Apple Git-78)

以下のコマンドでbrewのアップデートも兼ねてgitをアップグレード。(あ、ちゃんと🍺 マークが表示されてる!)

$ brew update
$ brew upgrade
$ brew install git
==> Downloading https://homebrew.bintray.com/bottles/git-2.11.0.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring git-2.11.0.sierra.bottle.tar.gz
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d

zsh completion has been installed to:
  /usr/local/share/zsh/site-functions

zsh functions have been installed to:
  /usr/local/share/zsh/site-functions

Emacs Lisp files have been installed to:
  /usr/local/share/emacs/site-lisp/git
==> Summary
🍺  /usr/local/Cellar/git/2.11.0: 1,452 files, 32.4M
$ 

...したつもりでしたがバージョンは変わらずでしたね。

$ git --version
git version 2.10.1 (Apple Git-78)

pyenvとvirtualenvとpyenv-virtualenvのインストール

pyenvのインストール

pyenvのインストール:

$ brew install pyenv
$ pyenv --version
pyenv 1.0.6

切替可能なPythonバージョン一覧の表示:

$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)

導入可能なバージョン一覧の確認:手元の環境では以下一覧が対象となっていました。

$ pyenv install --list
Available versions:
  2.1.3
  2.2.3
  2.3.7
  2.4
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5
  2.5.1
  2.5.2
  2.5.3
  2.5.4
  2.5.5
  2.5.6
  2.6.6
  2.6.7
  2.6.8
  2.6.9
  2.7-dev
  2.7
  2.7.1
  2.7.2
  2.7.3
  2.7.4
  2.7.5
  2.7.6
  2.7.7
  2.7.8
  2.7.9
  2.7.10
  2.7.11
  2.7.12
  2.7.13
  3.0.1
  3.1
  3.1.1
  3.1.2
  3.1.3
  3.1.4
  3.1.5
  3.2-dev
  3.2
  3.2.1
  3.2.2
  3.2.3
  3.2.4
  3.2.5
  3.2.6
  3.3.0
  3.3-dev
  3.3.1
  3.3.2
  3.3.3
  3.3.4
  3.3.5
  3.3.6
  3.4.0
  3.4-dev
  3.4.1
  3.4.2
  3.4.3
  3.4.4
  3.4.5
  3.5.0
  3.5-dev
  3.5.1
  3.5.2
  3.6.0
  3.6-dev
  3.7-dev
  anaconda-1.4.0
  anaconda-1.5.0
  anaconda-1.5.1
  anaconda-1.6.0
  anaconda-1.6.1
  anaconda-1.7.0
  anaconda-1.8.0
  anaconda-1.9.0
  anaconda-1.9.1
  anaconda-1.9.2
  anaconda-2.0.0
  anaconda-2.0.1
  anaconda-2.1.0
  anaconda-2.2.0
  anaconda-2.3.0
  anaconda-2.4.0
  anaconda-4.0.0
  anaconda2-2.4.0
  anaconda2-2.4.1
  anaconda2-2.5.0
  anaconda2-4.0.0
  anaconda2-4.1.0
  anaconda2-4.1.1
  anaconda2-4.2.0
  anaconda3-2.0.0
  anaconda3-2.0.1
  anaconda3-2.1.0
  anaconda3-2.2.0
  anaconda3-2.3.0
  anaconda3-2.4.0
  anaconda3-2.4.1
  anaconda3-2.5.0
  anaconda3-4.0.0
  anaconda3-4.1.0
  anaconda3-4.1.1
  anaconda3-4.2.0
  ironpython-dev
  ironpython-2.7.4
  ironpython-2.7.5
  ironpython-2.7.6.3
  ironpython-2.7.7
  jython-dev
  jython-2.5.0
  jython-2.5-dev
  jython-2.5.1
  jython-2.5.2
  jython-2.5.3
  jython-2.5.4-rc1
  jython-2.7.0
  jython-2.7.1b1
  jython-2.7.1b2
  jython-2.7.1b3
  miniconda-latest
  miniconda-2.2.2
  miniconda-3.0.0
  miniconda-3.0.4
  miniconda-3.0.5
  miniconda-3.3.0
  miniconda-3.4.2
  miniconda-3.7.0
  miniconda-3.8.3
  miniconda-3.9.1
  miniconda-3.10.1
  miniconda-3.16.0
  miniconda-3.18.3
  miniconda2-latest
  miniconda2-3.18.3
  miniconda2-3.19.0
  miniconda2-4.0.5
  miniconda2-4.1.11
  miniconda3-latest
  miniconda3-2.2.2
  miniconda3-3.0.0
  miniconda3-3.0.4
  miniconda3-3.0.5
  miniconda3-3.3.0
  miniconda3-3.4.2
  miniconda3-3.7.0
  miniconda3-3.8.3
  miniconda3-3.9.1
  miniconda3-3.10.1
  miniconda3-3.16.0
  miniconda3-3.18.3
  miniconda3-3.19.0
  miniconda3-4.0.5
  miniconda3-4.1.11
  pypy-c-jit-latest
  pypy-c-nojit-latest
  pypy-dev
  pypy-stm-2.3
  pypy-portable-2.3.1
  pypy-portable-2.4
  pypy-portable-2.5
  pypy-portable-2.5.1
  pypy-stm-2.5.1
  pypy-portable-2.6
  pypy-portable-2.6.1
  pypy-portable-4.0
  pypy-portable-4.0.1
  pypy-portable-5.0
  pypy-portable-5.0.1
  pypy-portable-5.1
  pypy-portable-5.1.1
  pypy-portable-5.3.1
  pypy-portable-5.4
  pypy-portable-5.4.1
  pypy-portable-5.6.0
  pypy-1.5-src
  pypy-1.5
  pypy-1.6
  pypy-1.7-dev
  pypy-1.7
  pypy-1.8-dev
  pypy-1.8
  pypy-1.9-dev
  pypy-1.9
  pypy-2.0-dev
  pypy-2.0-src
  pypy-2.0
  pypy-2.0.1-src
  pypy-2.0.1
  pypy-2.0.2-src
  pypy-2.0.2
  pypy-2.1-src
  pypy-2.1
  pypy-2.2-src
  pypy-2.2
  pypy-2.2.1-src
  pypy-2.2.1
  pypy-2.3-src
  pypy-2.3
  pypy-2.3.1-src
  pypy-2.3.1
  pypy-2.4.0-src
  pypy-2.4.0
  pypy-2.4-beta1-src
  pypy-2.4-beta1
  pypy-2.5.0-src
  pypy-2.5.0
  pypy-2.5.1-src
  pypy-2.5.1
  pypy-2.6.0-src
  pypy-2.6.0
  pypy-2.6.1-src
  pypy-2.6.1
  pypy-4.0.0-src
  pypy-4.0.0
  pypy-4.0.1-src
  pypy-4.0.1
  pypy-5.0.0-src
  pypy-5.0.0
  pypy-5.0.1-src
  pypy-5.0.1
  pypy-5.1-src
  pypy-5.1
  pypy-5.1.1-src
  pypy-5.1.1
  pypy-5.3-src
  pypy-5.3
  pypy-5.3.1-src
  pypy-5.3.1
  pypy-5.4-src
  pypy-5.4
  pypy-5.4.1-src
  pypy-5.4.1
  pypy-5.6.0-src
  pypy-5.6.0
  pypy2-5.3-src
  pypy2-5.3
  pypy2-5.3.1-src
  pypy2-5.3.1
  pypy2-5.4-src
  pypy2-5.4
  pypy2-5.4.1-src
  pypy2-5.4.1
  pypy2-5.6.0-src
  pypy2-5.6.0
  pypy3-dev
  pypy3-portable-2.3.1
  pypy3-portable-2.4
  pypy3-2.3.1-src
  pypy3-2.3.1
  pypy3-2.4.0-src
  pypy3-2.4.0
  pypy3.3-5.2-alpha1-src
  pypy3.3-5.2-alpha1
  pypy3.3-5.5-alpha-src
  pypy3.3-5.5-alpha
  pypy3.5-c-jit-latest
  pyston-0.5.1
  pyston-0.6.0
  stackless-dev
  stackless-2.7-dev
  stackless-2.7.2
  stackless-2.7.3
  stackless-2.7.4
  stackless-2.7.5
  stackless-2.7.6
  stackless-2.7.7
  stackless-2.7.8
  stackless-2.7.9
  stackless-2.7.10
  stackless-2.7.11
  stackless-2.7.12
  stackless-3.2-dev
  stackless-3.2.2
  stackless-3.2.5
  stackless-3.3-dev
  stackless-3.3.5
  stackless-3.4.1
  stackless-3.4.2

環境切替確認

任意の(導入可能な)Python環境をインストールし、切り替えてみる:あれ?切り替わってないですね...

$ pyenv install 3.5.2
$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 2.7.10

下記エントリに基づいて環境変数設定を行ってみたが状況変わらず。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ source .bash_profile 

下記エントリを参考にevalコマンドを実行したところ、無事解決しました。

$ eval "$(pyenv init -)"
$ python --version
Python 3.5.2

下記エントリの様に以下3行を ~/.bash_profileに追記しておくのが良いようですね。

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile

改めてバージョン切替を確認。

## 一旦元に戻してみる
$ pyenv global system
$ pyenv rehash
$ pyenv versions
* system (set by /Users/shinyaa31/.pyenv/version)
  3.5.2
$ python --version
Python 2.7.10

## 再度3.5.2に切替
$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 3.5.2

pyenvの利用可能コマンドやpyenvの使い方についてはこの辺りを参考にしておくと良さそうです。個人用リファレンスも兼ねてメモ。

virtualenvで環境を作成、整備

大元のバージョン(system:2.7.10)に一旦戻し、virtualenvをインストール。sudo実行時のオプションとして『-H』を付与しています。

$ pyenv global system
$ pyenv rehash
$ python --version
Python 2.7.10
$ sudo -H pip install virtualenv

ちなみに付与せず実行すると以下のようなアラートメッセージが表示されます。これを出さないようにするための措置としてオプションを付与して実行しています。

The directory '/Users/shinyaa31/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/shinyaa31/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.

切り替えた環境の方でも念の為virtualenvを導入しておく。(必要なのかな?)

$ pyenv global 3.5.2
$ pyenv rehash
$ python --version
Python 3.5.2
$ sudo -H pip install --upgrade pip
$ pip -V
pip 9.0.1 from /Users/shinyaa31/.pyenv/versions/3.5.2/lib/python3.5/site-packages (python 3.5)
$ sudo -H pip install virtualenv

上記作成環境をIntellij IDEAで連携

導入する環境としてはIntellij IDEA Ultimate Editionを用いています。

f:id:shinyaa31:20161231043110p:plain:w550

Intellij IDEA Python Pluginのインストール

Intellij IDEAでPythonを扱うにはプラグインが必要です。ですのでまずはそこから。

Intellij IDEA起動後、[Preferences]を選択。

f:id:shinyaa31:20161231044258p:plain:w550

[Plugins]→[Browse Repositories]を選択。

f:id:shinyaa31:20161231044301p:plain:w550

そのものズバリ[Python]というものがありますのでこれをインストール。インストールが終わるとIntellij IDEAの再起動を促されますので従います。

f:id:shinyaa31:20161231044305p:plain:w550

Intellij IDEA pyenv連携設定

pyenvを使って任意のバージョンを導入すると、以下の様な形で個別にバージョン毎のフォルダ及び構成が作成されます。Intellij IDEAの設定ではこのパスを読み込ませる事で個別の環境設定を踏まえたPythonプロジェクトを作成する事が可能です。ここでは /Users/shinyaa31/.pyenv/versions/3.5.2/bin/python3.5 のパス情報を設定する形で進めたいと思います。

$ pwd
/Users/shinyaa31/.pyenv/versions/3.5.2/bin
$ ls
2to3            idle            pip3            pydoc3.5        python3-config      python3.5m-config
2to3-3.5        idle3           pip3.5          python          python3.5       pyvenv
easy_install        idle3.5         pydoc           python-config       python3.5-config    pyvenv-3.5
easy_install-3.5    pip         pydoc3          python3         python3.5m      virtualenv

Intellij IDEAを起動、Pythonプロジェクトを作成。ここではデフォルトで選択可能なPython SDKを選ぶ形で一時的にプロジェクトを作成して行きます。

f:id:shinyaa31:20161231053923p:plain:w500

プロジェクト作成後、[File]→[Project Structure]を選択。

f:id:shinyaa31:20161231053955p:plain:w350

[Project SDK]から[New]→[Python SDK]を選択。

f:id:shinyaa31:20161231054111p:plain:w600

次いで[Add Local]を選択。

f:id:shinyaa31:20161231054311p:plain:w500

パス指定を求められますので上記指定のパスをここで設定します。ですがこの部分、macOSの[Open]のUIだと隠しフォルダの指定が出来ない模様。なので下記エントリの小技を用いつつ、上記指定パス(の上位フォルダ)を貼り付け。

f:id:shinyaa31:20161231054440p:plain:w500

対象としたいパスのファイルを指定します。

f:id:shinyaa31:20161231054713p:plain:w500

pyenvで導入した新たなPythonバージョンの環境をSDKに追加する事が出来ました! f:id:shinyaa31:20161231054920p:plain:w500

ちゃんと導入したバージョンでプログラムが動くかを試してみたいと思います。問題無さそうですね。

f:id:shinyaa31:20161231055032p:plain:w650

まとめ

という訳で諸々の環境設定、連動設定を行ってみた訳ですが、virtualenvはIntellij IDEA連携に必要無かったですね...。

ひとまずこれでPython系の開発環境をIntellij IDEAで整える方法は分かってきたので、適宜必要な環境を作成・管理して行こうと思います。