これまで次の方法で issue.py から Issue モジュールをインポートしてきました.これは呼び出し側のメインプログラムと同じフォルダに issue.py があるという前提でした.
from issue import Issue
一方で,例えばここのページでは次のような記述があります.
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram
from IPython.display import set_matplotlib_formats
Python ではモジュールをどのフォルダから探し出しているのでしょうか.これは sys モジュールの path 属性に記述されています.Anaconda をインストールした Windows では次のような結果が得られます.
import sys
for p in sys.path:
print(p)
C:\Users\UserName\Documents\work C:\Users\UserName\Anaconda3\python37.zip C:\Users\UserName\Anaconda3\DLLs C:\Users\UserName\Anaconda3\lib C:\Users\UserName\Anaconda3 C:\Users\UserName\AppData\Roaming\Python\Python37\site-packages C:\Users\UserName\Anaconda3\lib\site-packages C:\Users\UserName\Anaconda3\lib\site-packages\locket-0.2.1-py3.7.egg C:\Users\UserName\Anaconda3\lib\site-packages\win32 C:\Users\UserName\Anaconda3\lib\site-packages\win32\lib C:\Users\UserName\Anaconda3\lib\site-packages\Pythonwin C:\Users\UserName\Anaconda3\lib\site-packages\IPython\extensions C:\Users\UserName\.ipython
一方,macOS に Anaconda を標準インストールした場合には,次のような結果が得られます.
import sys
for p in sys.path:
print(p)
/Users/UserName/Documents/work /Users/UserName/opt/anaconda3/lib/python38.zip /Users/UserName/opt/anaconda3/lib/python3.8 /Users/UserName/opt/anaconda3/lib/python3.8/lib-dynload /Users/UserName/opt/anaconda3/lib/python3.8/site-packages /Users/UserName/opt/anaconda3/lib/python3.8/site-packages/aeosa /Users/UserName/opt/anaconda3/lib/python3.8/site-packages/locket-0.2.1-py3.8.egg /Users/UserName/opt/anaconda3/lib/python3.8/site-packages/IPython/extensions /Users/UserName/.ipython
さらに,macOS に pyenv を使って Anaconda をイントールした場合には次のような結果になります.
import sys
for p in sys.path:
print(p)
/Users/UserName/Documents/work /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python38.zip /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python3.8 /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python3.8/lib-dynload /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python3.8/site-packages /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python3.8/site-packages/aeosa /Users/UserName/.pyenv/versions/anaconda3-2021.05/lib/python3.8/site-packages/locket-0.2.1-py3.8.egg
これらの結果は OS,Python のインストール方法やそのバージョンによって多少異なります.しかしながら,いずれにせよサーチパスの先頭はプログラムが設置されたカレントフォルダになっています.つまり,from issue import Issue
というコードを実行すると,issue.py
をまずカレントフォルダで検索し,なければサーチパスに記述された順序で検索することを意味します.したがって,numpy.py
という名前のファイルを自身で作成してカレントフォルダに設置しまうと,import numpy as np
を実行した時に本来の NumPy ライブラリではなく自作のライブラリが読み込まれてしまうことになります.これを確かめるためには issue.py
を numpy.py
としてコピーして,次のコードが動くことを確認すればよいでしょう.本来の NumPy が使えなくなるので,このような方法は決しておすすめできません.
import numpy as np
issue1 = np.Issue('2nd Issue')
print(issue1.subject)
2nd Issue