6. I/Oプラグインインフラストラクチャ#
プラグインはソースと記述子.ini
の2つのファイルで構成されています。matplotlib
を使用してimshow
のプラグインを提供したいとします。プラグインにはmpl
という名前を付けます。
skimage/io/_plugins/mpl.py
skimage/io/_plugins/mpl.ini
.py
と.ini
ファイルの名前は一致する必要があります。.ini
ファイル内では、プラグインのメタデータを指定します。
[mpl] <-- name of the plugin, may be anything
description = Matplotlib image I/O plugin
provides = imshow <-- a comma-separated list, one or more of
imshow, imsave, imread, _app_show
「provides」行には、プラグインによって提供されるすべての関数が一覧表示されます。プラグインはimshow
を提供するため、mpl.py
内で定義する必要があります。
# This is mpl.py
import matplotlib.pyplot as plt
def imshow(img):
plt.imshow(img)
デフォルトでは、imshow
は非ブロッキングなので、GUIをブロックするための特別な関数_app_show
を提供する必要があります。以下の方法でプラグインを変更して提供できます。
[mpl]
provides = imshow, _app_show
# This is mpl.py
import matplotlib.pyplot as plt
def imshow(img):
plt.imshow(img)
def _app_show():
plt.show()
_plugins
ディレクトリ内のすべてのプラグインは、インポート時にskimage.io
によって自動的に調べられます。システム上のすべてのプラグインを一覧表示するか、
>>> import skimage as ski
>>> ski.io.find_available_plugins()
{'gtk': ['imshow'],
'matplotlib': ['imshow', 'imread', 'imread_collection'],
'pil': ['imread', 'imsave', 'imread_collection'],
'test': ['imsave', 'imshow', 'imread', 'imread_collection'],}
または、すでにロードされているプラグインのみを一覧表示するか
>>> ski.io.find_available_plugins(loaded=True)
{'matplotlib': ['imshow', 'imread', 'imread_collection'],
'pil': ['imread', 'imsave', 'imread_collection']}
use_plugin
コマンドを使用してプラグインをロードします。
>>> ski.io.use_plugin('pil') # Use all capabilities provided by PIL
または
>>> ski.io.use_plugin('pil', 'imread') # Use only the imread capability of PIL
特定の機能を複数のプラグインが提供している場合は、最後にロードされたプラグインが使用されることに注意してください。
プラグインの機能を照会するには、plugin_info
を使用します。
>>> ski.io.plugin_info('pil')
>>>
{'description': 'Image reading via the Python Imaging Library',
'provides': 'imread, imsave'}