pipを特定のpythonで使う時の悩み

 こんにちは、Youkeyです。今回は完全に自分向けの備忘録ではあるのですが、結論に到達するまで断片情報を辿り、迷ったためその内容をまとめました。

最初に結論

私はコーディングはあまり長くやっていませんが、趣味でも仕事でもとりあえずコードを書くとなればPythonしかできません。そんな私は、この度初めてMacを使う(社用PC)時に悩みました。そして今回は、あまり見慣れない、下記コマンドとオプション指定に辿り着きました、と言う話です。

python3 -m pip install --user <Package Name>

事の起こり

2020年12月にMacを使い始めましたが、Pythonが既にインストールされているんですよね。嬉しいんですが、Python 2.7.3 なんですよ。ターミナルからpythonインタプリタを叩いて使うヤツなので、いきなりバージョン見て驚きました。まだ使えるのか、Python2系。Printの書き方違うし、ドキュメント見るときに探さないとダメだし、まあ面倒。流石にここ1年ぐらいは流石にPython3系で書くように。anacondaやpyenvもわざわざ使わないでPython3だけをインストールした仮想マシンなどを多用して暮らしておりました。

とは言え、社用PCだけど比較的開発用にセットアップして貰えているので、もしかしてPython3系入っているかなと思ってシステムディレクトリを覗くと、

/usr/bin/python -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
/usr/bin/python-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
/usr/bin/python2 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
/usr/bin/python2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7
/usr/bin/python2.7-config -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7-config
/usr/bin/python3
/usr/bin/pythonw -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7
/usr/bin/pythonw2.7 -> ../../System/Library/Frameworks/Python.framework/Versions/2.7/bin/pythonw2.7

と、まあ、Python3 / Python2が双方いてPython = Python2.7としてくれています。普通にPythonと打てばPython2.7が実行されますよと。最初はPython = Python3とリンクを貼り直すかと思いましたが、思いとどまる。後が大変になりそう。なのでPython3をコマンドとしたり、Python Scriptの先頭に[#! /usr/bin/python3]とすりゃ使えるなーと思って、このまま使ってました。

pip

pipコマンドを忘れてましたね。いや、きちんと知らなかったんだなpipの事を。pipのコマンドをネットで記載があるように使うと

sudo pip install <Package Name>

などとやりませんか?私はこれをやってたので、今回ハマりました。まずこれを実施すると、パッケージのインストール先は管理者権限の必要なpython2.7のsite-package内にインストールされます。Python2.7以外からすれば、当然権限が無いディレクトリへインストールしているためimportに失敗します。Python3からするとPython2.7のディレクトリは他人だから読んじゃだめだわ。んー、だって sudo 無しだとインストール失敗するからさ(言い訳)。正しくは、

pip install --user <Package Name>

こっち。これでとりあえずはパッケージ領域ではなく、管理者権限不要なユーザディレクトリにパッケージを追加してくれます(ベースバイナリディレクトリの考え)。pipコマンド側もこれを推奨。

pip3

そこに登場するのはpip3というコマンド。pip3はPython3系でいわゆる[pip]コマンドとしてを使う事ができるので、pip3を使えば・・・甘い。pip3でインストールしても、やっぱりpython3からはimport失敗します。

バージョン管理はpip/pip3共通で出来るのでおかしいなーと思っていたのですが、

sudo pip3 install <Package Name>

とワザと分かってやってみて、気付いた。pip3のインストール先はPython2.7のsite-package内にあり、Python3のsite-package内は空でした。そりゃバージョン管理が共通になるわ。

僕の環境下ではpip/pip3は見た目は違えど、中身はPython2系のpipでした。

pipはコマンドだが、モジュール名でもある

えー、じゃあどうするんだ?と悩む。pipのドキュメント漁り、実はpipはpythonのモジュールであるため、

python -m pip install --user <Package Name>

という使い方ができる事に気付きました。なるほど!

sudo python3 -m pip install <Package Name>

とまたワザとインストールをしてみたら、見事Python3の管理者権限の必要なsite-package内にインストールされた。お、突破口が見えました。

python3 -m pip install --user <Package Name>

冒頭に書いた、コマンドとオプションに到達。

これで[ python3 ]で[ pip ]モジュールを[ --user ]オプションを使って、[ Packege Name ]をインストールするコマンド文が作れました。ちなみにpipはモジュール名なので、pip3と指定したら「そんなモジュール無い」って怒ります。Python2/3どちらでも、モジュール名はpipなんでしょうね

終わりに

本記事、私のMac環境下ではこうなった話です。多分前提とが違えば、違う動きになっちゃいますので、ご注意ください。[ Python2系をアンインストール ][ pyenvで切り替える ][ anaconda使う ]など、別な解決策や手段は存在していると思います。

ただ、僕と同じ悩みの人が、この記事で解決のお手伝いができれば嬉しいです。

この記事が気に入ったらサポートをしてみませんか?