python - 호출 - 이름을 가진 모듈을 가져 오는 방법?




파이썬 함수 이름 호출 (8)

참고 : impimportlib 에 찬성하여 Python 3.4부터 사용되지 않습니다.

언급 한 바와 같이 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

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

$ python myapp.py command1

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

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

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

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

__import __ (name, globals = None, locals = 없음, fromlist = (), level = 0)

이 함수는 주어진 전역 변수와 지역 변수를 사용하여 모듈 이름을 가져 와서 패키지 컨텍스트에서 이름을 해석하는 방법을 결정합니다. fromlist는 이름으로 주어진 모듈로부터 임포트되어야하는 객체 또는 서브 모듈의 이름을 제공합니다.

출처 : https://docs.python.org/3/library/functions.html#import

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

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

command_module.run()

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

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


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

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

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

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

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

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


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

importlib.import_module (name, package = None)

모듈 가져 오기. name 인수는 절대 또는 상대 용어로 가져올 모듈을 지정합니다 (예 : pkg.mod 또는 ..mod). 이름이 상대적인 용어로 지정되면 패키지 인수는 패키지 이름 해석을위한 앵커 역할을 할 패키지의 이름으로 설정되어야합니다 (예 : import_module ( '.. mod', 'pkg.subpkg'). pkg.mod를 가져옵니다).

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

다음은 나를 위해 일했다 :

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

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


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

>>>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>'

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

월 = 'feb'
exec '% s_module import *'% (월)



exec 를 사용할 수 있습니다 :

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




python-import