[Python] Modules & Packages


Pythonでコードの再利用性を向上させるモジュールとパッケージについて説明します
また、moduleがどのようにインポートされたかについて説明します.
  • モジュール:変数、関数、クラスを含むファイル
  • パッケージ:複数のモジュールを含むディレクトリ
  • モジュール/パッケージをインポートするには、Pythonがそのモジュール/パッケージのディレクトリを知っている必要があります.
    このとき、Pythonは以下のような手順で3箇所を調べ、Module/Packageを検索します.
    参考資料:https://docs.python.org/3/reference/import.html#the-meta-path
    1. sys.modules
    2. built-in
    3. sys.path
    ここsysもモジュールで、Pythonのbuild-inモジュールです.

    sys.modules


    最初にモジュールを検索した場所sys.modulesは、Pythonの実行後にインポートされたすべてのモジュールを含む辞書です.keyはモジュールの名前であり、valueはモジュールオブジェクトを格納します.
    出力sys.modulesは、sys, builtinsなどのモジュールがdict形式で格納されていることがわかります.
    >>> import sys
    
    >>> print(sys.modules.keys())
    dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_warnings', '_frozen_importlib_external', '_io', 'marshal', 'posix', '_thread', '_weakref', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', '_abc', 'abc', 'io', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', '_locale', '_bootlocale', 'types', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib', 'importlib.machinery', 'importlib.abc', '_operator', 'operator', 'keyword', '_heapq', 'heapq', 'itertools', 'reprlib', '_collections', 'collections', '_functools', 'functools', 'contextlib', 'importlib.util', 'mpl_toolkits', 'sphinxcontrib', 'zope', 'site', 'readline', 'atexit', 'rlcompleter'])
    
    >>> print(sys.modules['sys'])
    <module 'sys' (built-in)>
    
    >>> print(sys.modules['builtins'])
    <module 'builtins' (built-in)>

    built-in


    build-inモジュールはPythonのインストール時にデフォルトで保存されるモジュールです.
    build-inモジュールの例はsys, builtinsなどである.sysモジュールにはsys.modulesなどの辞書、sys.pathなどのリストが内蔵されています.
    また,builtinsモジュールにはsum, divmod等の関数やtuple, dict等の資料型が内蔵されている.
    これらのモジュールはいずれもC言語で記述されており,Pythonフォルダにはそれぞれsysmodule.c, bltinmodule.cの名前で格納されている.

    sys.path


    最後に、モジュールを探す場所sys.pathは、モジュールの位置を含むパス文字列のlistである.
    sys.pathは、scriptを実行するディレクトリを最初に追加し、PYTHONPATHと関連default site-packagesのインストールパスを追加します.
    (参考資料):https://docs.python.org/3/tutorial/modules.html#the-module-search-path'/Users/dongmyeong/projects/wecode/precourse/module-test'フォルダにあるmain.pyを実行した結果
    # main.py
    
    >>> import sys
    >>> print(sys.path)
    ['/Users/dongmyeong/projects/wecode/precourse/module-test', '/Users/dongmyeong/projects/wecode/precourse/module-test', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload', '/Users/dongmyeong/Library/Python/3.8/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages', '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend']