Pythonライブラリパスをコントロールする

ネタが続くので連日投稿です

PYTHON_PATHとsys.path

さて、前回の話の中でPYTHONPATHを使ってインポートできるディレクトリを追加していたわけだが、これは最終的に sys.path に追加されて、インポート可能になっている。

PYTHONPATH=aodag.hoge python

とやれば、$PWD/aodag.hoge が sys.pathに追加されるのでインポートできるってわけさ。

もちろん、sys.pathにpythonコード内で直接パスを追加してしまっても、同じようにインポートできる。

import sys

import os

sys.path.append(os.path.join(os.getcwd(), 'aodag.hoge')

ってやれば、カレントディレクトリのaodag.hogeディレクトリ以下からインポート可能。

 

.pthファイルでライブラリパスに追加する

sys.pathに追加する方法はこれ以外にもあって、.pthファイルをsite-packagesかUSERSITEにおく方法もある。

hoge.pthとかの名前でファイルを作ってその中にファイルパスを書けば、sys.pathに追加される。

ファイルパスは / か ./ とかで始まる必要があって、それ以外の文字列で始まるとpythonコードとみなされて、実行される。

ここまでが、python自体の機能。

 

マルチバージョン

次はマルチバージョンな話。

setuptoolsとかdistributeに入ってるpkg_resourcesは、バージョンを指定してパッケージをアクティブにする機能を持っている。

まず、マルチバージョンでインストールされていないと、使う意味がないので、その方法から。

easy_install -m "bucho==0.1.0"

easy_install -m "bucho==0.0.5"

-m オプションを使うとマルチバージョンインストールとなる。

通常easy_install使うと、自動でeasy-install.pthに追加されてインポート可能になるけど、マルチバージョンインストールすると追加されない。

なので、そのままだと、せっかくインストールしたbuchoパッケージをインポートできない状態になっている。

ここで、pkg_resourcesで、使いたいバージョンのbuchoパッケージをアクティブにする。

import pkg_resources

pkg_resources.require("bucho==0.1.0")

import bucho

requireすることで、sys.pathに対象バージョンのパッケージへのパスが追加される。

そうした後でインポートすればいいわけだ。

 

setup.py develop とか pip でリポジトリからインストールとか egg-linkとか

ちなみにこの話をするきっかけとなった質問は、pipでhgリポジトリからインストールしたけど、libにソースがないという話。

この場合は、hg cloneしたソースを pip --editableしてるわけで、まあ、python setup.py develop も動きは同じ。

で、libにソースがないってことなんだけど、実はeasy-install.pthにソースへのパスが追加されるので、インポートが可能になってるんだね。

この話について回答したときに、.pthじゃなくて.egg-linkができると答えてしまったのだが、これは間違いだった。

では、.egg-linkってなんのためにあるの?っていうと、これはegg-infoのためにある。

egg-infoはライブラリパスとは別の話で、pkg_resourcesがとりあつかうパッケージメタデータのためにあって、普通インストールされると、site-packagesに、bucho-0.1.0.egg/PKG_INFO とか、 bucho/EGG_INFO ってファイルができるんだけど、developした場合はソースの方にこれらのファイルがあるので、そのポインタのためにegg-linkファイルを生成してる。

egg-linkを見ると、ソースへのパスが入ってるのが分かると思う。

pkg_resourcesはEGG_INFOとかを探すときにegg-linkを見つけたら、その先のソースパスにegg-infoを探しに行くってことだね。

わかったかな?ae35さん。