記事
· 4 hr 前 7m read

Pythonモジュール入門

img

モジュールは重要なテーマです! 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 に追加する

まとめ

モジュールには、次のようなものが含まれます。

  • Pythonファイル(.py 拡張子があるものとないものがある)
  • __init__.py ファイルが含まれているフォルダ
  • Pythonスクリプト(これもまたモジュールです)
  • モジュールをインポートできない場合、sys.path リストに含まれているかどうか確認してください
ディスカッション (0)1
続けるにはログインするか新規登録を行ってください