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
に入り、python
と python2
は 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())