Python3で書いています。
プログラムにプラグインのサポートを追加したいと考えています。重いフレームワークは使いたくないので、最小限のものを自分で書くことにしました。
ちなみに、プラグインは時間までに実行する必要があります。再実行時にプラグインを常にアンロードしてロードするとは限りません。プラグインはすべてのデータを失います。
私のフォルダ構造はここにあります:
interfaces/
├── dummy
├── gmail
│ ├── __init__.py
│ └── __pycache__
│ └── __init__.cpython-33.pyc
└── hello
├── __init__.py
└── __pycache__
└── __init__.cpython-33.pyc
次に、プラグインをロードして実行するためのコードを書きました。
#!/usr/bin/python3
import os
import imp
INTERFACES_FOLDER = './interfaces'
MAIN_MODULE = '__init__'
def search_plugins():
plugins = []
plugins_folders = os.listdir(INTERFACES_FOLDER)
for i in plugins_folders:
plugin_folder = os.path.join(INTERFACES_FOLDER, i)
if not os.path.isdir(plugin_folder):
continue
if not MAIN_MODULE + '.py' in os.listdir(plugin_folder):
continue
info = imp.find_module(MAIN_MODULE, [plugin_folder])
plugins.append({'name': i, 'info': info})
return plugins
def load_plugin(plugin):
return imp.load_module(MAIN_MODULE, *plugin["info"])
plugins_list = search_plugins()
plugins = []
for i in plugins_list:
module = load_plugin(i)
print(module)
plugins.append(module)
print(plugins)
出力:
# it works!
<module '__init__' from './interfaces/gmail/__init__.py'>
<module '__init__' from './interfaces/hello/__init__.py'>
# what's wrong?
[<module '__init__' from './interfaces/hello/__init__.py'>,
<module '__init__' from './interfaces/hello/__init__.py'>]
ご覧のとおり、プラグインをロードすると、すべてが正しく機能しています。しかし、それらをリストに追加すると、異なるモジュールが同じモジュールになります。
どうしたの?