kenkovlog

けんこふたんっオフィシャユブヨグッ
アンッ!アンッ!アンッ!アンッ!

PYTHONPATH について

PYTHONPATH で少しはまったのでメモっ

まずは基本

Python は実行ファイルのあるディレクトリを sys.path に追加 します。 例を挙げると、subdir/test.py のコードが

import sys
from pprint import pprint

pprint(sys.path)

の時、実行結果は

~/test % python subdir/test.py
['/Users/username/test/subdir',
 '/Library/Python/2.7/site-packages/pip-1.2.1-py2.7.egg',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages',
 '/Library/Python/2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']

となります。 sys.path の結果を見れば分かるように、 実行ファイルが置かれているディレクトリのパス( /Users/username/test/subdir ) が追加されています。

PYTHONPATH

さて、PYTHONPATH を設定することでsys.path に追加できますが、次のようにすると何が起こるでしょう?

$ export PYTHONPATH=

空文字列を PYTHONPATH に設定しています。これはカレントディレクトリを追加することになるので

['/Users/username/test/subdir',
 '/Library/Python/2.7/site-packages/pip-1.2.1-py2.7.egg',
 '/Users/username/test',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
 '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC',
 '/Library/Python/2.7/site-packages',
 '/Library/Python/2.7/site-packages/setuptools-0.6c11-py2.7.egg-info']

となります。カレントディレクトリ ( /Users/username/test ) がsys.path に追加されているのが分かりますね。

はまってたところ

例えば設定スクリプト(.zshrc など) で、PYTHONPATH が設定されていない状態で次のように書いていた場合

export /add/to/python/library:$PYTHONPATH

PYTHONPATH は

$ echo $PYTHONPATH
/add/to/python/library:

となります。最後の : がポイントで、このコロンの後ろの空文字列によりカレントディレクトリが追加されるため、 結果的にsys.path にカレントディレクトリが追加されることになります。

注釈

$PATH についても同様です。$PATH はデフォルトで設定されているため上記のようなことはないと思いますが、

export PATH="":$PATH

とかは やってはいけません

けんこふたん