[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.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.Python 2.7 및 3.1 이상에서 권장되는 방법은 importlib 모듈을 사용하는 것입니다.
Python 2.7 및 3.1 이상에서 권장되는 방법은 importlib 모듈을 사용하는 것입니다.
e.
my_module = importlib.import_module('os.path')
-
==============================
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.imp 모듈을 사용하거나보다 직접적인 __import __ () 함수를 사용하십시오.
imp 모듈을 사용하거나보다 직접적인 __import __ () 함수를 사용하십시오.
-
==============================
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.exec를 사용할 수 있습니다 :
exec를 사용할 수 있습니다 :
exec "import myapp.commands.%s" % command
-
==============================
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.정말로 원하는 것은 플러그인 아키텍처입니다.
정말로 원하는 것은 플러그인 아키텍처입니다.
setuptools 패키지가 제공하는 엔트리 포인트 기능을 살펴 봐야합니다. 애플리케이션 용으로로드 된 플러그인을 찾을 수있는 좋은 방법을 제공합니다.
-
==============================
9.예 : 내 모듈 이름은 jan_module / feb_module / mar_module과 같습니다.
예 : 내 모듈 이름은 jan_module / feb_module / mar_module과 같습니다.
-
==============================
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.다음은 나를 위해 일했다 :
다음은 나를 위해 일했다 :
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
결과는 동적으로로드되는 클래스 "어댑터"목록입니다.
from https://stackoverflow.com/questions/301134/how-to-import-a-module-given-its-name by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 날짜를 기반으로 한 R 또는 Python의 요소 값 붙여 넣기 - 학교 간 나누기 만들기 (0) | 2018.10.09 |
---|---|
[PYTHON] 새 줄을 삽입하지 않고도 사용자 입력을받을 수 있습니까? (0) | 2018.10.09 |
[PYTHON] 개체가 파이썬에서 가비지 수집되는시기는 언제입니까? (0) | 2018.10.09 |
[PYTHON] Python : URLError : <urlopen 오류 [Errno 10060] (0) | 2018.10.08 |
[PYTHON] "정렬 할 수없는 유형 : int () <str ()" (0) | 2018.10.08 |