🐍

【Python】モジュールとパッケージとライブラリの違いとfromとimportについて

2024/07/03に公開

はじめに

今回は、Pythonのファイル上部に記載されているfromimportに加え、それらを理解するために必要な周辺知識についてまとめていく。

Pythonのファイル上部に記載されているFromとimport

fromキーワードとimportキーワード

from <PACKAGE_NAME> import <MODULE_NAME>
インポート文で読み込む理由

1. コードの再利用:
  一度定義した関数やクラスを、他のファイルでも再利用できる。
2. コードの整理:
  関連する機能をまとめて別ファイルに分けることで、コードベースの構造がわかりやすくなる。
3. メンテナンス性の向上:
  機能ごとにモジュールやパッケージに分けることで、修正や機能追加がしやすくなる。
4. ネームスペースの管理:
  同じ名前の関数や変数を複数のモジュールで使う場合でも、それぞれ独立して管理できる。

このfromキーワードとimportキーワードを理解するためには、モジュール・パッケージ・ライブラリについて理解しなければならない。

モジュール(Module)とは

  • Pythonコードをまとめたファイル。
  • 単体の~~~.pyファイルに定義されている。
  • ファイル名がそのままモジュール名となる。
  • モジュールを使うと、関連する関数、クラス、変数などを一つのファイルにまとめて管理できる。

モジュールの例

example_module.pyというファイルに変数、関数、クラスが定義されている。
# 変数の定義(database_nameにmy_databaseという変数を定義している)
database_name = "my_database"

# 関数の定義(defキーワードを用いて、2つの数値を足し合わせる関数を定義している)
def add_numbers(a, b):
    return a + b

# クラスの定義(classキーワードを用いて、円の面積を計算するメソッドを定義している)
class Circle:
  # クラスがインスタンス化されるときに呼び出されるコンストラクタ
    def __init__(self, radius):
        self.radius = radius
    
    # 円の面積を計算するメソッド
    def area(self):
        return 3.14 * self.radius ** 2
__init__ メソッドの意味と役割
__init__ メソッド
class Circle:
    def __init__(self, radius):
        self.radius = radius
  • Pythonの特殊なメソッド(特殊メソッドまたはマジックメソッドとも呼ばれる)で、クラスのインスタンス(オブジェクト)が生成された際に自動的に呼び出される初期化メソッド(=コンストラクタ)。
  • クラスは、データとそのデータに関連する処理(メソッド)をまとめたもの。クラスを使うことで、関連するデータと処理を一つの単位として扱うことができるため、再利用性がある。
  • コンストラクタ(init メソッド)は属性を付与するために非常に重要な役割を果たす。コンストラクタを使用することで、クラスのインスタンスが作成されたときに、インスタンス固有の属性を初期化し、設定することができる。
class Circle:
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2

# インスタンスの作成
circle1 = Circle(2)
circle2 = Circle(5)

# インスタンスの属性とメソッドの呼び出し
print(circle1.radius)  # Output: 2
print(circle2.radius)  # Output: 5
print(circle1.area())  # Output: 12.56
print(circle2.area())  # Output: 78.5

# circle3というインスタンスはまだ作成されていない
# circle3 = Circle(3) といったコードが必要
  • 上記のようにcircle3というインスタンスを呼び出そうとしても処理が実行できないことになる。
現在インポート可能なモジュールの一覧を表示するコマンド
  • dockerでない場合(REPL)
help('modules')
  • dockerでコンテナを起動している場合(REPL)
docker run -it python:latest
help('modules')
出力結果
>>> help('modules')
Please wait a moment while I gather a list of all available modules...
__future__          _testclinic         genericpath         runpy
__hello__           _testimportmultiple getopt              sched
__phello__          _testinternalcapi   getpass             secrets
_abc                _testmultiphase     gettext             select
_aix_support        _testsinglephase    glob                selectors
_ast                _thread             graphlib            setuptools
_asyncio            _threading_local    grp                 shelve
_bisect             _tkinter            gzip                shlex
_blake2             _tokenize           hashlib             shutil
_bz2                _tracemalloc        heapq               signal
_codecs             _typing             hmac                site
_codecs_cn          _uuid               html                smtplib
_codecs_hk          _warnings           http                sndhdr
_codecs_iso2022     _weakref            idlelib             socket
_codecs_jp          _weakrefset         imaplib             socketserver
_codecs_kr          _xxinterpchannels   imghdr              spwd
_codecs_tw          _xxsubinterpreters  importlib           sqlite3
_collections        _xxtestfuzz         inspect             sre_compile
_collections_abc    _zoneinfo           io                  sre_constants
_compat_pickle      abc                 ipaddress           sre_parse
_compression        aifc                itertools           ssl
_contextvars        antigravity         json                stat
_crypt              argparse            keyword             statistics
_csv                array               lib2to3             string
_ctypes             ast                 linecache           stringprep
_ctypes_test        asyncio             locale              struct
_curses             atexit              logging             subprocess
_curses_panel       audioop             lzma                sunau
_datetime           base64              mailbox             symtable
_dbm                bdb                 mailcap             sys
_decimal            binascii            marshal             sysconfig
_distutils_hack     bisect              math                syslog
_elementtree        builtins            mimetypes           tabnanny
_functools          bz2                 mmap                tarfile
_gdbm               cProfile            modulefinder        telnetlib
_hashlib            calendar            multiprocessing     tempfile
_heapq              cgi                 netrc               termios
_imp                cgitb               nis                 textwrap
_io                 chunk               nntplib             this
_json               cmath               ntpath              threading
_locale             cmd                 nturl2path          time
_lsprof             code                numbers             timeit
_lzma               codecs              opcode              tkinter
_markupbase         codeop              operator            token
_md5                collections         optparse            tokenize
_multibytecodec     colorsys            os                  tomllib
_multiprocessing    compileall          ossaudiodev         trace
_opcode             concurrent          pathlib             traceback
_operator           configparser        pdb                 tracemalloc
_osx_support        contextlib          pickle              tty
_pickle             contextvars         pickletools         turtle
_posixshmem         copy                pip                 turtledemo
_posixsubprocess    copyreg             pipes               types
_py_abc             crypt               pkg_resources       typing
_pydatetime         csv                 pkgutil             unicodedata
_pydecimal          ctypes              platform            unittest
_pyio               curses              plistlib            urllib
_pylong             dataclasses         poplib              uu
_queue              datetime            posix               uuid
_random             dbm                 posixpath           venv
_sha1               decimal             pprint              warnings
_sha2               difflib             profile             wave
_sha3               dis                 pstats              weakref
_signal             doctest             pty                 webbrowser
_sitebuiltins       email               pwd                 wheel
_socket             encodings           py_compile          wsgiref
_sqlite3            ensurepip           pyclbr              xdrlib
_sre                enum                pydoc               xml
_ssl                errno               pydoc_data          xmlrpc
_stat               faulthandler        pyexpat             xxlimited
_statistics         fcntl               queue               xxlimited_35
_string             filecmp             quopri              xxsubtype
_strptime           fileinput           random              zipapp
_struct             fnmatch             re                  zipfile
_symtable           fractions           readline            zipimport
_sysconfigdata__linux_x86_64-linux-gnu ftplib              reprlib             zlib
_testbuffer         functools           resource            zoneinfo
_testcapi           gc                  rlcompleter

Enter any module name to get more help.  Or, type "modules spam" to search        
for modules whose name or summary contain the string "spam".


はじめにの画像でimport 〇〇という部分を良く見ると、import csvimport jsonなど先ほど表示したモジュール一覧の中に含まれていることがわかる

パッケージ(Package)とは

  • 複数のモジュールをまとめたディレクトリ(フォルダ)のこと。
  • パッケージのディレクトリには、__init__.pyという特殊なファイルが含まれている必要がある。
__init__.pyファイルとは
math_packageの中にmath_utils.pyモジュールとadvanced_math.pyモジュール定義されており、__init__.pyによってパッケージ化されている。
math_package/
    __init__.py
    math_utils.py
    advanced_math.py
現在インポート可能なパッケージの一覧を表示するコマンド
  • REPLで確認する方法
printの前のインデントを忘れずに実行する
import pkg_resources

installed_packages = pkg_resources.working_set
for package in installed_packages:
    print(f"{package.key} ({package.version})")
  • docker execコマンドで確認する方法
docker exec -it <container_id_or_name> pip list
  • pip list コマンドで確認する方法
pip list
出力結果
$ docker exec -it test-python-web-1 pip list
Package                  Version
------------------------ -----------
asgiref                  3.8.1
cachetools               4.2.4
certifi                  2024.6.2
charset-normalizer       3.3.2
Django                   3.2.25
et-xmlfile               1.1.0
httplib2                 0.22.0
idna                     3.7
oauthlib                 3.2.2
openpyxl                 3.1.4
packaging                24.1
pip                      24.1.1
protobuf                 4.25.3
psycopg2-binary          2.9.9
pyasn1                   0.6.0
pyasn1_modules           0.4.0
pyparsing                3.1.2
python-dateutil          2.9.0.post0
pytz                     2024.1
requests                 2.32.3
requests-oauthlib        2.0.0
rsa                      4.9
setuptools               65.5.1
six                      1.16.0
sqlparse                 0.5.0
typing_extensions        4.12.2
uritemplate              4.1.1
urllib3                  2.2.2
wheel                    0.43.0
requirements.txtとpip listで表示される内容の違い

requirements.txt:

  • 特定のプロジェクトで必要なパッケージを定義するためのファイル。
  • プロジェクトの依存関係を管理し、他の環境で再現するために使用されます。

pip list:

  • 現在のPython環境にインストールされているすべてのパッケージの一覧を表示するためのコマンド。
  • システム全体または特定の仮想環境で実行できます。

ライブラリとは

  • 特定の機能を提供するモジュールやパッケージの集合体のこと。
  • 開発者が必要に応じて呼び出して使用。
  • 例としてRequestsNumPyなどがライブラリに該当する。
Requestsライブラリ(タスクはHTTPリクエストの送受信)
import requests

response = requests.get('https://api.example.com/data')
print(response.json())
現在インポート可能なライブラリの一覧を検索するサイト

まとめ

・欲しい機能がまとまっているライブラリがあれば、https://pypi.org/より、検索してアプリケーションにインストールする。
・欲しい機能がない場合は、自分でモジュールやパッケージを作成する。
・必要な機能を使用したい~~.pyファイルの上部でfromキーワードとimportキーワードでモジュールやパッケージを宣言して使用する。

モジュールとサブパッケージの違い

  • モジュール:
    Python ファイル(.py)で、特定の機能を提供します。例えば、django.urls はモジュールです。
  • サブパッケージ:
    他のモジュールを含むディレクトリです。django.utils や django.db などはサブパッケージで、さらにその中に複数のモジュールが含まれています。

参考

https://docs.python.org/3/tutorial/modules.html

Discussion