6. 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
来阻塞 GUI。我们可以修改我们的插件来提供它,如下所示。
[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'}