皆様いかがお過ごしでしょうか、歌乃です。

久々の記事投稿です。

忙しいというか、それだけ充実した日常だったのだと思います (思いたい) 。

さて、相変わらず、LLM関連のあれやこれやを勉強中です。

そしてそれらの基礎技術として python が必要になります。

もう、息をするように python が使えないと話になりません ( ゚Д゚)

しかし、元来記憶力が微妙な私はいろいろと覚えきれないので備忘録としてここに記しておきます。

※いつものごとくほぼ、戯言です。


Python のグローバルライブラリが汚部屋のようになっていて非常に気持ちが悪い

はい、なんのこっちゃ?と思ったあなたのために説明します。

Python はユーザーが必要に応じてライブラリに機能を追加することで様々なプログラムが使用可能になります。いわゆる拡張可能な言語という事ですね。

ただ、この拡張機能は便利な反面、あるプログラムで必要だったライブラリが、こちらのプログラムでは全く必要ない、所謂、無駄資源になってしまうという状態がよく起きます。

開発環境ではそれで良くても (良くはないがまあ我慢できる) 実行環境ではなるべく無駄は減らしたいですし、そういった余分は思わぬ不具合の原因になったりもします。

そのため python では仮想環境構築という便利な機能が用意されています。

開発環境を仮想環境上に構築し、それを開発環境毎に用意することで、余分なライブラリを減らして余計な不具合を避け、開発効率と実行環境のスリム化を図れるというわけです。

仮想環境にも問題がないわけではないですが、デメリットよりはメリットが上回っていると言えるでしょう。


仮装環境 venv

ちなみに私は仮想環境として venv を使用しています。

開発時にはこの仮想環境 venv を使用して、仮想環境内に使用するバージョンの python をインストールし、必要なライブラリを追加していきます。

こうして書くと何も問題が無いように見えますが、実は windows 環境では大きな落とし穴があります。


python 複数バージョン共存の弊害

windows (に限ったことではないけど) では複数のバージョンの python を使い分けることができます。

なんでそんなめんどくさいことをするかと言うと、これが仮想環境の弊害の一つと言えるかもしれませんが、仮想環境は、そのまま実行環境として使用できるようになっています。仮想環境には python も必要なライブラリも、プログラムソースも入っているからです。

さてここで、OSに入っている python のバージョンと仮想環境の python のバージョンが違っている場合はどうなるでしょう?

そうです、仮想環境内のプログラムがバージョンの違いによって動かない、という状況が発生します。

とくに仮想環境内に python 本体が入ってない場合は、確実にバージョンの問題が発生します。

そのため、複数の python を使い分けるという、一見無駄にみえる状態が日常化します。


windows 用 python ランチャー py という混乱の元凶

windows 版の python には py という python ランチャーが含まれています。

py が何をするかと言うと OSの設定 に従って、使用する python 実行ファイルを切り替えてくれるという、便利なんだかそうでもないんだか、よくわからないやつです。

py の存在価値はスクリプト内で ”py” と書いておけば、OS側でどの Python バージョンを使っていても処理できる、言い換えると、python のバージョンが変わっても、スクリプトを書き換えずに済む、というそれだけのために存在しています (偏見です)。

python は結構バージョンの変更が激しいので、まあわからんでもないんですが ( ゚Д゚)

以前の記事にも書いたように、windows ではOS側の python、仮想環境の python、py が指定する python と、最悪の場合3つの異なるバージョンが存在している場合があります。

そしてこの状態がどういった弊害を生むかと言うと、しょっぱなの見出しに書いた「Python のグローバルライブラリが汚部屋のようになっていて非常に気持ちが悪い」が発生します。


どうしてそれが起こるのか

具体例をあげます。

github で、これは!とおもうようなコードを見つけたとします。そこには親切にも install 方法が記述してあります。

pip install hogehoge

さて、問題です。この場合 hogehoge はどこにインストールされるでしょうか。

答え、OS側でpath通った python、つまりどこかよくわからない python のライブラリに追加されます。
※path 設定を覚えていればよくわからなくは無い。

よく見かける、

pip install -r requirements.txt

の場合も同様です。

ほかにも、よくあるパターンとしてポータブル(埋め込み)タイプの python を利用したプログラムの場合、python.exe の存在するディレクトリに移動して、そのディレクトリ内で

cd .\project\python_embeded
python -m pip install -r requirements.txt

とした場合もpath の通った python のライブラリに追加されます。

え?( ゚Д゚) と思った方もいるでしょう。windows の場合、python というコマンドはあくまでもコマンドであり、カレントディレクトリの実行ファイルを指したりはしません。

もし、カレントディレクトリ内の python.exe を動かしたい場合は

.\python.exe -m pip install -r requirements.txt

と記述しなければなりません。 ※この場合はカレントディレクトリの python実行ファイル配下のライブラリに追加されます。たぶん、こちらが本来求める動作だと思います。


予防策として

予防策というか、もう脊髄反射的に覚えるしかないのですが、pip を使う時は必ず仮想環境に入ってから使用するしかありません。

pip + ほにゃらら、するまえに必ず

.\venv\Scripts\activate
venv> pip install -r requirements.txt
または
venv> python -m pip install -r requirements.txt

仮想環境を activate し、仮想環境下で pip するのであれば、必ず仮想環境下の python ライブラリに追加されます。


Python のグローバルライブラリを空にする

さて、長々と書きましたが、そういった罠にさんざんひっかかったおかげで、グローバルライブラリ ( OS 上で現在有効になっている python のライブラリ) に不必要なライブラリが大量に含まれるという状況が発生します。

まあ、何か問題が起きるというわけではないですが、一度気付くと気になって仕方がない というありがちな理由により、一度キレイにしておこうと思い立ちました。


再インストール

手っ取り早い方法として python の再インストールがあります。

一度すべてアンインストールしておいて、windows の場合パッケージ化されているので公式から DL してそれを入れなおせばいいというわけです。

ただこの方法は anaconda などの管理パッケージを使用している場合うまくいきません。


pip uninstall を使用する

pip install したのだから pip uninstall すればいいというわけですね。

ただし、ライブラリ内には大量のパッケージがあると思うので、一つ一つ uninstall するのは大変です。

多分過去に同じことを感じた人が居たのでしょう、システマティックに uninstall を繰り返す方法が用意されています。

手順的には install されている、パッケージをファイルに書き出し、それを使って uninstall する、という方法です。

ちょうど pip install -r requirements.txt の逆ですね。

インストールされたパッケージやライブラリを確認するには

pip list

を使います。この list の内容をファイルに書き出すには

pip list --format=freeze > requirements.txt

とします。pip freeze でも同じようなことができますが、環境によってはバージョン情報ではなくファイルの path が記述される場合もあるので、pip list の結果を書式指定で書きだす方法を取ります。

書き出したファイルを使用して uninstall するには

pip uninstall -r -y .\requirements.txt

とします。

ERROR: To modify pip, please run the following command:
D:\Users\hogehoge\anaconda3\python.exe -m pip uninstall -r requirements.txt

といったようなエラーが出る場合は、python 実行ファイルを指定する必要があるので、エラーに表示されている通り

D:\Users\hogehoge\anaconda3\python.exe -m pip uninstall -r requirements.txt -y

といったかんじで実行しましょう。




pip uninstall とくに 設定ファイルを使った場合のやり方をすぐ忘れるので、個人的な備忘録として書いてみました(`・ω・´)

ポスト いいんじゃね。と感じたらポストしてもらえると喜びます。
タイーツ タイーツもできます。