brew/pip3 install ipython の違い

Homebrew を使って IPython を導入する際、brew install を使うやり方と、pip3 install をやり方の主に 2 つの方法があると思います。前者でやると IPython 起動時に PYTHONPATH を勝手に書き換えてしまうことが分かり、少しはまりました。そもそも ipython コマンドというのは bash script だったり、Python script だったり、環境によって違うのだということを知りました。

macOS 10.15.5 です。

Homebrew 環境の構築

これは書くまでもありませんが、https://brew.sh/の説明通りに次のコマンドを実行します。

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

brew install ipython の場合(非推奨)

さて、IPython を入れたいのだから brew install ipython と単純にやると次のようになります。

$ brew install ipython
$ rehash
$ which python
/usr/bin/python
$ which python2
/usr/bin/python2
$ which python3
/usr/bin/python3
$ which ipython
/usr/local/bin/ipython
$ which pip 
pip not found
$ which pip3
/usr/bin/pip3

つまり、macOS 標準の Python をデフォルトとして維持したまま ipython コマンドだけ入ります(実際には他にも色々と入りますが)。pip3 も入りません。

そして ipython の中身は次の bash script です。PYTHONPATH を勝手に書き換えてしまいます。

$ cat `which ipython`
#!/bin/bash
PYTHONPATH="/usr/local/Cellar/ipython/7.15.0/libexec/lib/python3.8/site-packages:/usr/local/Cellar/ipython/7.15.0/libexec/vendor/lib/python3.8/site-packages" exec "/usr/local/Cellar/ipython/7.15.0/libexec/bin/ipython" "$@"

これで PyROOT を使おうと思っても PYTHONPATH から ROOTSYS/lib が消えてしまい、おかしいおかしいと悩んでしまいました。これは bug じゃないかと思いますが、Homebrew の issue report をどこに上げるのかよく分からなかったので、放置しています。

brew install python を先にする場合(非推奨)

$ brew install python
$ rehash 
$ which python 
/usr/bin/python
$ which python2
/usr/bin/python2
$ which python3
/usr/local/bin/python3
$ which pip 
pip not found
$ which pip3
/usr/local/bin/pip3

python3 コマンドが /usr/local/bin に入り、pythonpython2 は OS 標準です。この場合だと、pip3 も入りました。

$ brew install ipython
$ rehash
$ which ipython
/usr/local/bin/ipython

ipython の中身は同じです。

$ cat `which ipython`
#!/bin/bash
PYTHONPATH="/usr/local/Cellar/ipython/7.15.0/libexec/lib/python3.8/site-packages:/usr/local/Cellar/ipython/7.15.0/libexec/vendor/lib/python3.8/site-packages" exec "/usr/local/Cellar/ipython/7.15.0/libexec/bin/ipython" "$@"

pip3 install の場合(推奨)

$ brew install python
$ rehash
$ pip3 install ipython
$ rehash

brew install python の後に rehash を忘れないようにしましょう。そうしないと、/usr/bin/pip3 が使われてしまいます。

cat `which ipython`
#!/usr/local/opt/python/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from IPython import start_ipython
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())
$ cat `which ipython3`
#!/usr/local/opt/python/bin/python3.7
# -*- coding: utf-8 -*-
import re
import sys
from IPython import start_ipython
if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())

はい、こっちだと PYTHONPATH を勝手に書き換えませんし、bash ではなく Python です。こちらのやり方が推奨です。

Conda の場合

これは conda create で新しい環境を作ったときに入った ipython コマンドの中身です。また中身が違いますが、ほとんど一緒です。

#!/Users/oxon/anaconda3/envs/sstcam_root/bin/python

# -*- coding: utf-8 -*-
import re
import sys

from IPython import start_ipython

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(start_ipython())