복붙노트

[PYTHON] 이름을 가진 모듈을 가져 오는 방법?

PYTHON

이름을 가진 모듈을 가져 오는 방법?

예를 들어 인수로 명령으로 사용하는 Python 응용 프로그램을 작성하고 있습니다.

$ python myapp.py command1

응용 프로그램을 확장 가능하게 만들려면 기본 응용 프로그램 원본을 변경하지 않고 새 명령을 구현하는 새 모듈을 추가 할 수 있어야합니다. 나무는 다음과 같이 보입니다.

myapp/
    __init__.py
    commands/
        __init__.py
        command1.py
        command2.py
    foo.py
    bar.py

그래서 나는 응용 프로그램이 런타임에 사용 가능한 명령 모듈을 찾고 적절한 모듈을 실행하기를 원합니다.

파이썬은 모듈 이름에 문자열을 취하는 __import__ 함수를 정의합니다 :

그래서 저는 현재 다음과 같은 것을 가지고 있습니다 :

command = sys.argv[1]
try:
    command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
    # Display error message

command_module.run()

이것은 잘 작동합니다.이 코드를 사용하여 수행중인 작업을 수행하는 데 더 관용적 인 방법이 있는지 궁금합니다.

특히 계란이나 연장 점을 사용하고 싶지는 않습니다. 이것은 오픈 소스 프로젝트가 아니며 "플러그인"이있을 것으로 기대하지 않습니다. 요점은 기본 응용 프로그램 코드를 단순화하고 새 명령 모듈을 추가 할 때마다 수정해야 할 필요성을 제거하는 것입니다.

해결법

  1. ==============================

    1.2.7 / 3.1 이전의 Python을 사용하면 그렇게하는 것이 좋습니다.

    2.7 / 3.1 이전의 Python을 사용하면 그렇게하는 것이 좋습니다.

    최신 버전은 Python 2 및 Python 3 용 importlib.import_module을 참조하십시오.

    원한다면 exec를 사용할 수 있습니다.

    또는 __import__를 사용하여 다음과 같이 모듈 목록을 가져올 수 있습니다 :

    >>> moduleNames = ['sys', 'os', 're', 'unittest'] 
    >>> moduleNames
    ['sys', 'os', 're', 'unittest']
    >>> modules = map(__import__, moduleNames)
    

    다이브로 파이썬에서 바로 찢어졌습니다.

  2. ==============================

    2.Python 2.7 및 3.1 이상에서 권장되는 방법은 importlib 모듈을 사용하는 것입니다.

    Python 2.7 및 3.1 이상에서 권장되는 방법은 importlib 모듈을 사용하는 것입니다.

    e.

    my_module = importlib.import_module('os.path')
    
  3. ==============================

    3.언급 한 바와 같이 임프 (imp) 모듈은 로딩 기능을 제공합니다.

    언급 한 바와 같이 임프 (imp) 모듈은 로딩 기능을 제공합니다.

    imp.load_source(name, path)
    imp.load_compiled(name, path)
    

    비슷한 것을 수행하기 위해 이전에 이것을 사용했습니다.

    필자의 경우 필자는 정의 된 메소드가 필요한 특정 클래스를 정의했다. 모듈을로드 한 후에 클래스가 모듈에 있는지 확인한 다음 해당 클래스의 인스턴스를 다음과 같이 만듭니다.

    import imp
    import os
    
    def load_from_file(filepath):
        class_inst = None
        expected_class = 'MyClass'
    
        mod_name,file_ext = os.path.splitext(os.path.split(filepath)[-1])
    
        if file_ext.lower() == '.py':
            py_mod = imp.load_source(mod_name, filepath)
    
        elif file_ext.lower() == '.pyc':
            py_mod = imp.load_compiled(mod_name, filepath)
    
        if hasattr(py_mod, expected_class):
            class_inst = getattr(py_mod, expected_class)()
    
        return class_inst
    
  4. ==============================

    4.imp 모듈을 사용하거나보다 직접적인 __import __ () 함수를 사용하십시오.

    imp 모듈을 사용하거나보다 직접적인 __import __ () 함수를 사용하십시오.

  5. ==============================

    5.당신이 당신의 지역 주민들에게 그것을 원한다면 :

    당신이 당신의 지역 주민들에게 그것을 원한다면 :

    >>> mod = 'sys'
    >>> locals()['my_module'] = __import__(mod)
    >>> my_module.version
    '2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)]'
    

    동일한 작업이 전역 ()과 작동합니다.

  6. ==============================

    6.exec를 사용할 수 있습니다 :

    exec를 사용할 수 있습니다 :

    exec "import myapp.commands.%s" % command
    
  7. ==============================

    7.@monkut의 솔루션과 비슷하지만 재사용 가능하고 오류에 견딜 수있는 기능은 http://stamat.wordpress.com/dynamic-module-import-in-python/에 설명되어 있습니다.

    @monkut의 솔루션과 비슷하지만 재사용 가능하고 오류에 견딜 수있는 기능은 http://stamat.wordpress.com/dynamic-module-import-in-python/에 설명되어 있습니다.

    import os
    import imp
    
    def importFromURI(uri, absl):
        mod = None
        if not absl:
            uri = os.path.normpath(os.path.join(os.path.dirname(__file__), uri))
        path, fname = os.path.split(uri)
        mname, ext = os.path.splitext(fname)
    
        if os.path.exists(os.path.join(path,mname)+'.pyc'):
            try:
                return imp.load_compiled(mname, uri)
            except:
                pass
        if os.path.exists(os.path.join(path,mname)+'.py'):
            try:
                return imp.load_source(mname, uri)
            except:
                pass
    
        return mod
    
  8. ==============================

    8.정말로 원하는 것은 플러그인 아키텍처입니다.

    정말로 원하는 것은 플러그인 아키텍처입니다.

    setuptools 패키지가 제공하는 엔트리 포인트 기능을 살펴 봐야합니다. 애플리케이션 용으로로드 된 플러그인을 찾을 수있는 좋은 방법을 제공합니다.

  9. ==============================

    9.예 : 내 모듈 이름은 jan_module / feb_module / mar_module과 같습니다.

    예 : 내 모듈 이름은 jan_module / feb_module / mar_module과 같습니다.

  10. ==============================

    10.아래 작품은 나를 위해 일했다.

    아래 작품은 나를 위해 일했다.

    >>>import imp; 
    >>>fp, pathname, description = imp.find_module("/home/test_module"); 
    >>>test_module = imp.load_module("test_module", fp, pathname, description);
    >>>print test_module.print_hello();
    

    쉘 스크립트로 가져 오려면 다음을 수행하십시오.

    python -c '<above entire code in one line>'
    
  11. ==============================

    11.다음은 나를 위해 일했다 :

    다음은 나를 위해 일했다 :

    import sys, glob
    sys.path.append('/home/marc/python/importtest/modus')
    fl = glob.glob('modus/*.py')
    modulist = []
    adapters=[]
    for i in range(len(fl)):
        fl[i] = fl[i].split('/')[1]
        fl[i] = fl[i][0:(len(fl[i])-3)]
        modulist.append(getattr(__import__(fl[i]),fl[i]))
        adapters.append(modulist[i]())
    

    'modus'폴더에서 모듈을로드합니다. 모듈에는 모듈 이름과 동일한 이름을 가진 단일 클래스가 있습니다. 예 : modus / modu1.py 파일은 다음을 포함합니다 :

    class modu1():
        def __init__(self):
            self.x=1
            print self.x
    

    결과는 동적으로로드되는 클래스 "어댑터"목록입니다.

  12. from https://stackoverflow.com/questions/301134/how-to-import-a-module-given-its-name by cc-by-sa and MIT license