Pythonモジュール入門

モジュールは重要なテーマです! ObjectScriptにはこの概念はありませんが、Pythonでは基本的な考え方です。 一緒に見ていきましょう。
モジュールとは?
モジュールは、クラスとパッケージの間にある中間層だと私は考えています。 例を見てみましょう。
悪い例:
# MyClass.py
class MyClass:
def my_method(self):
print("Hello from MyClass!")
別のスクリプトでこのクラスを使用する場合、次のようになります。
# class_usage.py
from MyClass import MyClass # weird, right?
my_instance = MyClass()
my_instance.my_method()
なぜこれは悪い例なのでしょうか?
まず最初に、PEP 8によると、ファイル名は snake_case(スネークケース)にする必要があり、my_class.py にするべきです。
次に、クラスと同じ名前のファイルからクラスをインポートしています。 Phthonではこれは良いプラクティスではありません。
特に、ObjectScriptのようにクラスと同じ名前のファイルにクラスを定義する環境から来ると、これは分かりにくいかもしれません。
高度な概念
モジュールとは、Pythonファイルのことです
先ほど見たように、モジュールは .py 拡張子が付いていなくても、Pythonファイルである場合があります。
ということは、pythonスクリプトもモジュールであるということでしょうか? そのとおりです!
スクリプトをインポートする際には注意が必要なのはそのためです。スクリプト内のコードが実行されるからです。 詳しくは、Python入門の記事をご覧ください。
モジュールとは、__init__.py ファイルを含むフォルダのことです
えっ、フォルダもモジュールにできるんですか? はい、できます!
__init__.py ファイルが含まれていれば、フォルダはモジュールになります。 このファイルは空のままでも問題ありませんし、モジュールの初期化コードを含めることもできます。
例を見てみましょう。
src/python/article/
└── my_folder_module/
├── __init__.py
├── my_sub_module.py
└── another_sub_module.py
# my_folder_module/my_sub_module.py
class MySubModule:
def my_method(self):
print("Hello from MySubModule!")
# my_folder_module/another_sub_module.py
class AnotherSubModule:
def another_method(self):
print("Hello from AnotherSubModule!")
# my_folder_module/__init__.py
# This file can be empty or contain initialization code for the module.
この場合、my_folder_module はモジュールであり、次のようにインポートできます。
from my_folder_module import my_sub_module, another_sub_module
または、以下のコンテンツで __init__.py ファイルを定義する場合:
# my_folder_module/__init__.py
from .my_sub_module import MySubModule
from .another_sub_module import AnotherSubModule
次のようにインポートできます。
from my_folder_module import MySubModule, AnotherSubModule
微妙な違いが分かりますか? サブモジュールを指定せずにモジュールから直接クラスをインポートできます。モジュールをインポートする際に __init__.py ファイルが実行され、モジュールのネームスペースで利用できるものを定義できるためです。
sys.path
モジュールをインポートすると、Pythonは sys.path にリストされているディレクトリ内を探します。 これは、モジュールの検索パスを指定する文字列リストです。
以下のコードを実行して、現在の sys.path を確認できます。
import sys
print(sys.path)
デフォルトでは、現在のディレクトリとPythonのインストールに応じたさまざまなディレクトリが含まれます。
ランタイム時に sys.path にディレクトリを追加することもでき、特定の場所からモジュールをインポートしたい場合に便利です。 例えば、次のとおりです。
import sys
sys.path.append('/path/to/your/module')
from your_module import YourClass
これは、以前の記事でモジュールをインポートする前にモジュールにパスを追加したためです。
Set sys = ##class(%SYS.Python).Import("sys")
do sys.path.append("/irisdev/app/src/python/article")
set my_module = ##class(%SYS.Python).Import("my_module")
sys.pathとその他のディレクトリ
sys.path には他にどんなディレクトリがあるのでしょうか? 通常、次のようなものが含まれています。
- 入力スクリプトを含んでいるディレクトリ(スクリプトが指定されていない場合は現在のディレクトリ)。
- 標準ライブラリのディレクトリ。これにはPythonに標準搭載されている組み込みモジュールが含まれています。
- site-packagesディレクトリ。サードパーティのパッケージがインストールされています。
site-packages
site-packagesの仕組みとは? pipを使ってパッケージをインストールすると、sys.path に自動的に含まれている site-packages ディレクトリにインストールされます。 これにより、場所を指定する必要なしにパッケージをインポートできます。
🤨🔍 しかし、site-packagesディレクトリはどのように、どこで、誰によって設定されるのでしょうか?
site-packages ディレクトリは、Pythonのインストール中に作成され、通常はPythonインストールの lib ディレクトリに配置されます。 正確な場所は、使用しているオペレーティングシステムと、Pythonがどのようにインストールされたかによって異なります。
例えば、典型的なLinuxインストールでは、site-packages ディレクトリは以下に配置される場合があります。
/usr/local/lib/python3.x/site-packages
Windowsでは、以下に配置される場合があります。
C:\Python3x\Lib\site-packages
pip を使ってパッケージをインストールすると、sys.path に自動的に含まれている site-packages ディレクトリにインストールされます。 これにより、場所を指定する必要なしにパッケージをインポートできます。
import site
print(site.getsitepackages())
🤨🔍 Pythonインタープリターはいつ、どこで site.py ファイルを読み込むのか?
site.py ファイル(標準ライブラリのディレクトリに配置されます)は、Pythonインタープリターを開始すると自動的に実行されます。 このファイルが site-packages ディレクトリを設定して sys.path に追加します。 このファイルは、Pythonインストールの標準ライブラリのディレクトリに配置されます。
IRISでのsys.path
IRISにも site.py ファイルがあり、<installation_directory>/lib/python/iris_site.py に配置されています。 このファイルは、IRISでスクリプト/モジュールを開始またはインポートする際に実行され、sys.path を設定します。
大まかに言うと、iris_site.py ファイルは以下を行います。
- デフォルトの
site-packagesディレクトリを保持する <installation_directory>/lib/python/ディレクトリをsys.pathに追加する- ここにIRIS Pythonモジュールが配置されます。ユーザー定義のモジュールをここに配置しないでください。
<installation_directory>/mgr/python/ディレクトリをsys.pathに追加する- ここにカスタムのPythonモジュールを配置できます
- 構成文字列のPythonPathを
sys.pathに追加する- PythonPathは、IRIS管理ポータルまたはmerge/cfgファイルで構成できます
- https://docs.intersystems.com/iris20251/csp/docbook/Doc.View.cls?KEY=GEPYTHON_flexible#GEPYTHON_flexible_overview
まとめ
モジュールには、次のようなものが含まれます。
- Pythonファイル(
.py拡張子があるものとないものがある) __init__.pyファイルが含まれているフォルダ- Pythonスクリプト(これもまたモジュールです)
- モジュールをインポートできない場合、
sys.pathリストに含まれているかどうか確認してください