かすみん日記

暇なときに何か喋ります

【Mac】python がいっぱい!?

なんかpythonコマンドがいっぱいあるし、pipもいっぱいあって混乱しそうなので一通り調査した。

mac ユーザ一般の話ではないかもしれないが、一応個人的な備忘録として置いておく。

環境

  • macOS Catalina
  • 大昔にpython環境を作った気がする(覚えてない)

pythonコマンドがいっぱいある

pythonで始まるコマンドを探してみる。

 % ls -1 /usr/bin/python*
/usr/bin/python@
/usr/bin/python-config@
/usr/bin/python2@
/usr/bin/python2.7@
/usr/bin/python2.7-config@
/usr/bin/python3*
/usr/bin/pythonw@
/usr/bin/pythonw2.7@

また、

% ls -1 /usr/local/bin/python*
/usr/local/bin/python3@
/usr/local/bin/python3-config@
/usr/local/bin/python3.7@
/usr/local/bin/python3.7-config@
/usr/local/bin/python3.7m@
/usr/local/bin/python3.7m-config@
/usr/local/bin/pythontex@

ね? なんかいっぱいあるでしょ。

ls の後に付けた -1 (数字の一)は、改行して表示するオプション。

homebrewのパッケージリストも見てみる。

% brew list
(略)
python
python3
python@3.8
(略)

お、おう。

勝手に入れたの誰?

まずは /usr/bin にある方から。

ls -l (オプションはアルファベットのエル)で詳細を見てみる。

% ls -l /usr/bin/python*
lrwxr-xr-x  1 root  wheel     75 10  9  2019 /usr/bin/python@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel     82 10  9  2019 /usr/bin/python-config@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
lrwxr-xr-x  1 root  wheel     75 10  9  2019 /usr/bin/python2@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel     75 10  9  2019 /usr/bin/python2.7@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
lrwxr-xr-x  1 root  wheel     82 10  9  2019 /usr/bin/python2.7-config@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
-rwxr-xr-x  1 root  wheel  31488  4  7 05:38 /usr/bin/python3*
lrwxr-xr-x  1 root  wheel     76 10  9  2019 /usr/bin/pythonw@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7
lrwxr-xr-x  1 root  wheel     76 10  9  2019 /usr/bin/pythonw2.7@ -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7

ファイル名の後に @ が付いているものはシンボリックリンク

そして -> の後に書いてあるのが、オリジナルのファイルの場所。

これらシンボリックリンクのオリジナルはどれも /System/Library/Frameworks/ 以下にあるらしい。

よく知らんけど、macOS にデフォルトで搭載しているpythonかと思われる。多分。

しかし、/usr/bin/python3 ひとつだけは、実行ファイルが直置きされている。

ヘルプオプションを見てみると

% /usr/bin/python3 -h
usage: /Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python [option] ... [-c cmd | -m mod | file | -] [arg] ...
(略)

のように書いてあるので、Xcodeインストールしたときに一緒に付いてたやつかな?

次に /usr/local/bin にある方。

結論から言えば、ここにあるのは全てhomebrewでインストールしたpythonシンボリックリンク。(/usr/local/bin/pythontexは別。後述)

例えば、python3 の詳細を見てみると

% ls -l /usr/local/bin/python3
lrwxr-xr-x  1 <usr name>  admin  34  3 23 17:22 /usr/local/bin/python3@ -> ../Cellar/python/3.7.7/bin/python3

てな感じで、/usr/local/Cellar/ 以下にリンク元のコマンドが配置されてる。

このディレクトリはhomebrewが管理しているパッケージが置かれている場所なので、先に書いた結論が得られる。

自分で直接pythonbrew installした覚えがなくても、別のパッケージの依存関係としてインストールされることがある。

homebrewで詳細を見てみると

% brew info python
python: stable 3.7.7 (bottled), HEAD
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/usr/local/Cellar/python/3.7.7 (8,615 files, 120.9MB) *
  Built from source on 2020-03-23 at 17:22:31
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb
==> Dependencies
Build: pkg-config ✔
Required: gdbm ✔, openssl@1.1 ✔, readline ✔, sqlite ✔, xz ✔
(略)

てな感じで、いくつかのパッケージに必要とされている。

Required: gdbm ✔, openssl@1.1 ✔, readline ✔, sqlite ✔, xz ✔

pure "python" 以外は何者?

pureな python 以外にも python と名がつくファイルがある。

python の後に数字がついているものは、簡単に察しがつく。そう、pythonのバージョンである。

確認してみる。

まずは /usr/bin/ の方。(多分)デフォルトで入ってるやつ。

% /usr/bin/python -V
Python 2.7.16

% /usr/bin/python2 -V
Python 2.7.16

% /usr/bin/python3 -V
Python 3.7.3

などなど。

次に /usr/local/bin にある方。こっちは homebrewの管理下。

% /usr/local/bin/python3 -V
Python 3.7.7

% /usr/local/bin/python3.7 -V
Python 3.7.7

% /usr/local/bin/python3.7m -V
Python 3.7.7

しかし、brew listしたときには3種類のpythonpythonpython3python@3.8が表示されていた。

brew info でそれぞれ見てみるとpythonpython3 は同じディレクトリを指していたので、実際は同一のものらしい。(昔は2系と3系を別々に扱っていたと思われる。多分、私が2系の方をバージョン3にアップデートしてしまった?)

python@3.8は別物のようだが、 /usr/local/binシンボリックリンクは作られていない。

また、それぞれのディレクトリで python-config のような(一応)実行ファイルが存在しているが、名前から察するに構成ファイルなんだろうが、よくわからない。ユーザが直接実行するようなものではなさそう。

あと、他に pythonw というのもあるが、wが何の意味なのかは不明。バージョンは次の通り。

% /usr/bin/pythonw -V
Python 2.7.16

/usr/local/bin/pythontexリンク元/usr/local/texlive/ にあるので texlive のなんかツールなんでしょう。

path to python

で、結局、重要なのは、ターミナルで単に python と打ったときに実行されるのはどれって訳よ。

パスの優先順位は /usr/bin < /usr/local/bin なので、同名のコマンドが置いてあると後者にある方が実行される。

なので、考えればわかるが、実際に確認してみると次のよう;

% which python
/usr/bin/python

% which python2
/usr/bin/python2

% which python3
/usr/local/bin/python3

もう2系は使わないし、せっかくbrewで管理してるんだから、単に python と打ったときにはbrew管理の3系 /usr/local/bin/python3 を実行して欲しい。

じゃあ、エイリアスを設定しよう、、、とその前に、もっとややこしい pip の方も見ておこう。。。

pip

pippythonのためのパッケージ管理ツール。homebrewのpython版だわな。

また、pythonのパッケージ管理は pip だけじゃなくて、Aanacondaというのもある。

とりま標準でpythonと一緒についてくるのが pipなので、ここではその話をする。

pip から始まるコマンドを探してみる。

% ls -1 /usr/bin/pip*  
/usr/bin/pip3*

% ls -1 /usr/local/bin/pip*
/usr/local/bin/pip*
/usr/local/bin/pip2*
/usr/local/bin/pip2.7*
/usr/local/bin/pip3@
/usr/local/bin/pip3.7@

どひゃ。

homebrewの方は、brew list では表示されないので、個別にではなくpythonのパッケージと一緒に管理しているっぽい。

/usr/bin/ には実行ファイル pip3 が直置きされている。同じところに直置きされていた /usr/bin/python3 のためのものであろう。

では、 /usr/local/bin/ の方の詳細を見る。

% ls -l /usr/local/bin/pip*
-rwxr-xr-x  1 root    admin  284  9 13  2019 /usr/local/bin/pip*
-rwxr-xr-x  1 root    admin  286  9 13  2019 /usr/local/bin/pip2*
-rwxr-xr-x  1 root    admin  290  9 13  2019 /usr/local/bin/pip2.7*
lrwxr-xr-x  1 <usr name>  admin   31  3 23 17:22 /usr/local/bin/pip3@ -> ../Cellar/python/3.7.7/bin/pip3
lrwxr-xr-x  1 <usr name>  admin   33  3 23 17:22 /usr/local/bin/pip3.7@ -> ../Cellar/python/3.7.7/bin/pip3.7

実行ファイルが直置きされている pippip2pip2.7 の3つは、所有者が root になっていることからも、それぞれ /usr/bin/ の方にシンボリックリングが置かれていた pythonpython2python2.7 のためのものだと推測できる。

残る2つのシンボリックリンクは、pythonコマンドのときと同じような感じであろう。

つまり、 pip3pip3.7 は(オリジナルのファイル名も違うが)同一のもので、/usr/local/bin/python3 (あるいは /usr/local/bin/python3.7)の面倒を見ている。

結局

ということで、最後にエイリアスを設定して終わりにしよう。

bash なら ~/.bash_profile に、zsh なら ~/.zshrc に、以下の設定を追加する。

alias python='/usr/local/bin/python3'
alias pip='/usr/local/bin/pip3'

source コマンドで設定ファイルの再読み込み;

source ~/.zshrc

すると、単に python を打つだけで、brewでインストールした python 3系が起動する;

% python -V
Python 3.7.7

% pip -V
pip 20.0.2 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)

お疲れ様でした!!

find コマンド

はじめ、どこにpythonがあるのかわからんかったので、 /usr/ 以下に検索かけたときのメモ。

pythonから始まる名前のファイルかシンボリックリンク/usr 以下で探して、あれば標準出力にパスを表示するコマンド;

find /usr \( -type f -o -type l \) -a -name "python*"

ファイルに出力したければ、 コマンドの後ろにパイプ > pypy.txt をつければいい。

find コマンドの基本形は

find <dir> -name <file name>

のような感じ。

ファイル名以外にもオプションで条件を指定する;

option 説明
-type f 普通のファイル
-type l シンボリックリンク
-name <file name> ファイルの名前。ワイルドカードも使える。
-o オプションの論理和 OR
-a オプションの論理積 AND
\( \) オプションの論理構造を明確化。括弧内が先に処理される。

以上!!