なんかpythonコマンドがいっぱいあるし、pipもいっぱいあって混乱しそうなので一通り調査した。
mac ユーザ一般の話ではないかもしれないが、一応個人的な備忘録として置いておく。
環境
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が管理しているパッケージが置かれている場所なので、先に書いた結論が得られる。
自分で直接pythonを brew 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種類のpython: python
、python3
、python@3.8
が表示されていた。
brew info
でそれぞれ見てみるとpython
と python3
は同じディレクトリを指していたので、実際は同一のものらしい。(昔は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
pip
はpythonのためのパッケージ管理ツール。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
実行ファイルが直置きされている pip
、pip2
、pip2.7
の3つは、所有者が root
になっていることからも、それぞれ /usr/bin/
の方にシンボリックリングが置かれていた python
、python2
、python2.7
のためのものだと推測できる。
残る2つのシンボリックリンクは、pythonコマンドのときと同じような感じであろう。
つまり、 pip3
と pip3.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 |
\( \) |
オプションの論理構造を明確化。括弧内が先に処理される。 |
以上!!