Python入門トップページ


目次

  1. プログラミング言語
  2. Anaconda - Jupyter Notebook / JupyterLab の環境設定
  3. Python の基礎
  4. リスト,タプル,辞書,集合
  5. 再び Jupyter Notebook の操作
  6. Python の制御構文
  7. 関数
  8. 便利な関数など
  9. リストの内包表記
  10. 多次元リスト
  11. クラス
    1. クラスの定義とインスタンス化
    2. クラスの初期化
    3. 属性の変更
    4. メソッドの定義(ゲットメソッド)
    5. メソッドの定義(セットメソッド)
    6. メインモジュール
    7. クラスのインポート
    8. クラスの属性を取り出す
    9. クラスの属性値を取り出す
    10. クラスの属性と値を辞書形式で得る
    11. クラスの属性を削除する
    12. モジュールのサーチパス
    13. 様々なインポート方法
  12. 演習問題
  13. 雑多な情報

Python の基礎

クラス

モジュールのサーチパス

これまで次の方法で 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.pynumpy.py としてコピーして,次のコードが動くことを確認すればよいでしょう.本来の NumPy が使えなくなるので,このような方法は決しておすすめできません.

import numpy as np
issue1 = np.Issue('2nd Issue')
print(issue1.subject)
2nd Issue

目次に戻る