筆者はここ何年もPythonの書籍を何冊か執筆し、定期的に本コラムにてPythonプログラムを紹介してきた。そのため、比較的安定したバージョンのPythonを使っている。しかし、先日、久しぶりに最新版にアップデートしたら、pipコマンドの使用で警告が表示されるようになってしまった。しかも正しくパッケージがインストールできなくなった。今回、その原因をいろいろ調べたみたので紹介しよう。
pipとは何だろうか?
最初にpipについて復習しておこう。既にPythonを使ったことがあるならば、誰しもpipのお世話になったことがあるだろう。一言で言えば、pipとはPythonのパッケージマネージャーだ。Pythonのさまざまなパッケージを集約した『Python Package Index (PyPI) 』にあるパッケージをコマンド一発でインストールできるのでとても便利な存在だ。pipを使えば、新規パッケージのインストールや削除、現在インストールされているパッケージの一覧を確認することができる。
なお、PyPIのWebサイトには、現在305,050ものプロジェクトが登録されており、それらは複雑に依存し合っている。そのため、手動でこれらのプロジェクトをインストールするのは骨が折れる作業となる。しかし、pipを利用すれば、依存関係を自動的に判定して適切なパッケージをインストールしてくれるのだ。
過去にはPythonのために、いろいろなパッケージマネージャーが登場したが、現在はpipが主流となり、Python3.4以降では本体にもpipが付属するようになった。そのため、pipなしでPythonは語れないと言っても過言ではないだろう。
pipコマンドで警告が表示されるようになった問題
ところで、冒頭で紹介したように筆者の環境(macOS/Python3.9.5)にて、pipコマンドを実行すると以下のような警告が表示されるようになってしまった。
WARNING: pip is being invoked by an old script wrapper. This will fail in a future version of pip.
この警告は「このpipコマンドは古く将来的には使えなくなる」という強めのメッセージだ。いろいろ調べてみると、これは全ての環境で表示される警告ではない。
どうやら、Pythonとpipのバージョンが合致しないときに表示されるようだ。つまり、Pythonの最新版をインストール場合に、過去のPythonのバージョンが残っていて、pipは過去のPythonで実行されているような場合にこの問題が起きる。
確かに「pip install ***」を実行した時、パッケージのインストールには成功するのだが、実際にプログラムを実行してみると、「ModuleNotFoundError: No module named '***'」とモジュールが見つからない旨のエラーが出る。
だいたいの場合、pipコマンドのインストール先が、実行したいPythonのバージョンが異なっているというのが原因だ。pipコマンドのインストール先を、実行したいPythonのバージョンのものに変更すれば良いのだが、パスの設定を変更する必要があり簡単ではなかった。
そのため、大抵の場合は、一度、インストールしているPythonを全てでアンインストールし、新たにPythonをインストールすることで問題は解決する。とは言え、非常に手間がかかる上に、特定のバージョンでしか動かないプログラムというのもあるので厄介な問題だ。
なお、複数のバージョンのPythonを円滑に切り替えて使うには、WindowsではPythonランチャー(py)や、macOSやLinuxではpyenvを使うのが一般的だ。
推奨のpipの使い方
先ほどの警告と共に参考となるURLが示されていたので、そのURLを読んでみると、Pythonのパッケージをインストールするには、直接pipコマンドを使うのではなく、pythonコマンドを介してpipモジュールを使う方法が推奨されるとのことだった。
例えば、インストールされているパッケージの一覧を確認したい場合には、「pip3 list」というコマンドを実行するのだが、pythonコマンドを利用して、以下のように実行する。(この時、macOSやLinuxでは、pythonをpython3と置き換えて実行しよう。)
python -m pip list
そして、新たなパッケージをインストールしたい場合には、「python -m pip install (パッケージ名)」のように指定する。
例えば、beautifulsoup4というパッケージをインストールする場合には、以下のようなコマンドを実行する。
python -m pip install beautifulsoup4
ちょっとタイプするコマンドが長くなるが、これなら確実にパスの通っているPythonのバージョンに対してパッケージをインストールできるので、トラブルも少なくなるということだ。
なお、pipのドキュメントを見ると、やはりpipコマンドを使うのではなく「python -m pip (コマンド)」の書式で使うことが推奨されている。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。直近では、「シゴトがはかどる Python自動処理の教科書(マイナビ出版)」「すぐに使える!業務で実践できる! PythonによるAI・機械学習・深層学習アプリのつくり方 TensorFlow2対応(ソシム)」「マンガでざっくり学ぶPython(マイナビ出版)」など。