I/O插件基础设施

插件由两个文件组成:源文件和描述符 .ini 。假设我们想要提供一个插件,用于 imshow 使用 matplotlib 。我们将我们的插件命名为 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 是非阻塞的,所以是一个特殊的函数 _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.io as io
>>> io.find_available_plugins()
{'gtk': ['imshow'],
 'matplotlib': ['imshow', 'imread', 'imread_collection'],
 'pil': ['imread', 'imsave', 'imread_collection'],
 'qt': ['imshow', 'imsave', 'imread', 'imread_collection'],
 'test': ['imsave', 'imshow', 'imread', 'imread_collection'],}

或仅已加载的文件::

>>> io.find_available_plugins(loaded=True)
{'matplotlib': ['imshow', 'imread', 'imread_collection'],
 'pil': ['imread', 'imsave', 'imread_collection']}

插件是使用 use_plugin 命令::

>>> import skimage.io as io
>>> io.use_plugin('pil') # Use all capabilities provided by PIL

>>> io.use_plugin('pil', 'imread') # Use only the imread capability of PIL

请注意,如果多个插件提供某些功能,则使用最后加载的插件。

要查询插件的功能,请使用 plugin_info ::

>>> io.plugin_info('pil')
>>>
{'description': 'Image reading via the Python Imaging Library',
 'provides': 'imread, imsave'}