문제

Python에서 "child"모듈을 다른 모듈로 가져 와서 속성을 나열하는 것은 상당히 사소한 일이지만 가져 오려고 할 때 약간 더 어려워집니다. 모두 어린이 모듈.

기존 3D 애플리케이션을위한 도구 라이브러리를 구축하고 있습니다. 각 도구에는 자체 메뉴 항목과 하위 메뉴가 있습니다. 컨텍스트와 템플릿을 기반으로 많은 메뉴가 변경 될 때이 도구가 자체 메뉴를 만들고 싶습니다. 내 기본 모듈이 모든 자식 모듈을 찾아서 확인할 수 있기를 바랍니다. create_menu() 기능하고 그것을 찾으면 전화하십시오.

모든 어린이 모듈을 발견하는 가장 쉬운 방법은 무엇입니까?

도움이 되었습니까?

해결책

사용 dir () 그리고 IMP 모듈

다른 팁

이런 종류의 플러그인 작업을 수행하는 가장 좋은 방법은 entry_points 그리고 쿼리에 대한 API.

내가 친절하고 파이썬에서 프로그래밍을 시작했을 때 나는 모듈 식 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]

안전하거나 "올바른"방법은 아니지만 어쩌면 우리는 유용 할 것입니다. 이것의 매우 오래된 코드 그래서 제발 나를 이기지 마십시오.

파일 시스템 기반 모듈로 모든 플러그인을 구현하는 한 서브 모듈을 찾기위한 파일 시스템을 가로 지르는 솔루션은 괜찮습니다.

보다 유연한 방법은 기본 모듈의 명시적인 플러그인 목록이며, 모든 플러그인 (파일로 생성, 동적 또는 클래스 인스턴스)이 해당 목록에 자체적으로 추가되는 모든 플러그인이 있습니다. 아마도 레지스터 플러그 인 함수를 통해.

기억하십시오 : "명시 적은 암시 적보다 낫다"는 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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top