13

Pythonでは、「子」モジュールを別のモジュールにインポートしてその属性を一覧表示するのはかなり簡単ですが、すべての子モジュールをインポートする場合は少し難しくなります。

既存の3Dアプリケーション用のツールのライブラリを構築しています。各ツールには、独自のメニュー項目とサブメニューがあります。多くのメニューはコンテキストとテンプレートに基づいて変更されるため、ツールが独自のメニューを作成する責任を負ってほしいと思います。create_menu()基本モジュールですべての子モジュールを検索し、関数をチェックして、見つかった場合はそれを呼び出すことができるようにしたいと思います。

すべての子モジュールを検出する最も簡単な方法は何ですか?

4

6 に答える 6

3

entry_pointsこの種のプラグインを実行する最善の方法は、それらを照会するためのAPI を使用することだと思います。

于 2011-09-06T13:44:00.340 に答える
1

私が親切で、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]

安全でも「正しい」方法でもありませんが、それでも役立つかもしれません。非常に古いコードなので、私を殴らないでください。

于 2009-05-26T18:37:09.343 に答える
-1

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)
于 2009-05-26T18:41:25.047 に答える
-2

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

于 2009-05-26T18:34:05.670 に答える