🐍
【Python】モジュールとパッケージとライブラリの違いとfromとimportについて
はじめに
今回は、Pythonのファイル上部に記載されているfrom
とimport
に加え、それらを理解するために必要な周辺知識についてまとめていく。
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 csv
やimport 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環境にインストールされているすべてのパッケージの一覧を表示するためのコマンド。
- システム全体または特定の仮想環境で実行できます。
ライブラリとは
- 特定の機能を提供するモジュールやパッケージの集合体のこと。
- 開発者が必要に応じて呼び出して使用。
- 例として
Requests
、NumPy
などがライブラリに該当する。
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 などはサブパッケージで、さらにその中に複数のモジュールが含まれています。
参考
Discussion