ネタが続くので連日投稿です
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さん。