どうすべての子どものモジュールはPythonの?
-
06-09-2019 - |
質問
ですがかなり明にPythonのインポートする"子どもの"モジュールを他のモジュールおよびそのリストすることはできないことになりにくいたい場合、輸入 すべての 子モジュールです。
私はビルには、図書室のツールが既存の3D願います。各ツールは、独自のメニュー項目サブメニューを取り揃えております。私のツールとして機能するアニュアル作成に責任を負う独自のメニューとして多くの変化に基づくコンテキストとテンプレート。私は私のベースモジュールへの参加を希望されるすべての子モジュールやチェック create_menu()
機能を呼び出するものであれば、これを見ます。
何が最も簡単な方法を発見すべての子モジュール?
他のヒント
と思い、このようなプラグインも使 entry_points
の APIの照会し.
私がまだ Python でプログラミングを始めたばかりの頃、モジュラー IRC ボット用に次のように書きました。
# Load plugins
_plugins = []
def ifName(name):
try:
return re.match('([^_.].+)\.[^.]+', a).group(1)
except:
return None
def isValidPlugin(obj):
from common.base import PluginBase
try:
if obj.__base__ == PluginBase:
return True
else:
return False
except:
return False
plugin_names = set(ifilter(lambda a: a!=None, [ifName(a) for a in os.listdir(os.path.join(os.getcwd(), 'plugins'))]))
for plugin_name in plugin_names:
try:
plugin = __import__('plugins.'+plugin_name, fromlist=['plugins'])
valid_plugins = filter(lambda a: isValidPlugin(a), [plugin.__getattribute__(a) for a in dir(plugin)])
_plugins.extend(valid_plugins)
except Exception, e:
logger.exception('Error loading plugin %s', plugin_name)
# Run plugins
_plugins = [klass() for klass in _plugins]
これは安全な方法でも「正しい」方法でもありませんが、それでも役に立つかもしれません。その とても 古いコードなので殴らないでください。
のサブモジュールを見つけるためのファイルシステムを横断上記溶液は限り、あなたは、ファイルシステムベースのモジュールとして、すべてのプラグインを実装してokです。
より柔軟な方法は、明示的にそのリストに自分自身を追加する(モジュールが動的ファイル、またはクラスのインスタンスさえによって作成されたかどうか)あなたのメインモジュール内の明示的なプラグインのリストで、すべてのプラグインを持っているでしょう。たぶんregisterPlugin機能を経由してます。
注意:「明示的、暗黙よりも優れている」のpythonの禅の一部です。
。あなたはディレクトリをglob
bing試すことができます:
import os
import glob
modules = glob.glob(os.path.join('/some/path/to/modules', '*.py'))
そして、あなたはそれらをインポートしようとすることができます:
checked_modules
for module in modules:
try:
__import__(module, globals(), locals()) # returns module object
except ImportError:
pass
else:
checked_modules.append(module)