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'}