読者です 読者をやめる 読者になる 読者になる

Python の環境変数でハマった

最近いろんなプログラミング言語を触ってみたりしています。
Python もそのひとつなのですが、環境変数のせいでうまく動かなかったので備忘録的なメモ。


前提として、Windows 環境でなおかつ Cygwin も入れています。
Windows でも動く Python と、Cygwin 上で動く Python が別々に存在しています。


Windows 側のものはうまく動いていたのですが、 Cygwin 側の Python では、一部の標準モジュールがインポートできず、help() すら失敗するというわけのわからん状態になっていました。
Cygwin の方もちゃんと動くようにしたい!
で、あれやこれやと調べてみて、環境変数 PYTHONHOME が悪さをしていたことを突き止めました。


どういうことかというと、PYTHONHOME に Windows 用のパスが書き込まれていたのでした。「C:\Python27」みたいな感じで。
公式ドキュメントには、PYTHONHOME についてこんな風に書かれています。

標準 Python ライブラリの場所を変更します。デフォルトでは、ライブラリは prefix/lib/pythonversion と exec_prefix/lib/pythonversion から探されます。ここで、 prefix と exec_prefix はインストール依存のディレクトリで、両方共デフォルトでは /usr/local です。

PYTHONHOME が1つのディレクトリに設定されている場合、その値は prefix と exec_prefix の両方を置き換えます。それらに別々の値を指定したい場合は、 PYTHONHOME を prefix:exec_prefix のように指定します。

http://docs.python.jp/2.7/using/cmdline.html#envvar-PYTHONHOME


設定にコロンが使えることに注目です。
つまり「C:\Python27」という指定だと、コロンの前後で値を分けて、ライブラリの検索パスを「C/lib/python27」「\Python27/lib/python27」というナゾのものにしてしまうというわけなのでした。


環境変数を直接消してしまうとどういう影響が出るのかわからないので、Cygwin 側の設定ファイルで PYTHONHOME を消すようにしたら、Cygwin でも Python のライブラリがきちんとインポートされるようになりました。


つーか、デフォルトでいいはずの環境変数が何故設定されていたんだろう?