質問

ですがかなり明にPythonのインポートする"子どもの"モジュールを他のモジュールおよびそのリストすることはできないことになりにくいたい場合、輸入 すべての 子モジュールです。

私はビルには、図書室のツールが既存の3D願います。各ツールは、独自のメニュー項目サブメニューを取り揃えております。私のツールとして機能するアニュアル作成に責任を負う独自のメニューとして多くの変化に基づくコンテキストとテンプレート。私は私のベースモジュールへの参加を希望されるすべての子モジュールやチェック create_menu() 機能を呼び出するものであれば、これを見ます。

何が最も簡単な方法を発見すべての子モジュール?

役に立ちましたか?

解決

を使用 dir()impモジュール

他のヒント

と思い、このようなプラグインも使 entry_pointsAPIの照会し.

私がまだ 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の禅の一部です。

あなたはディレクトリをglobbing試すことができます:

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top