Python 표준 모듈 importlib 상세 설명

6601 단어 Python모듈importlib
1 모듈 소개
Python 은 표준 라 이브 러 리 의 일부분 으로 importlib 패 키 지 를 제공 합 니 다.목적 은 Python 에서 import 문장의 실현(그리고import__함수또한 importlib 는 프로그래머 가 사용자 정의 대상 을 만 들 수 있 도록 허용 하고 도입 과정(importer 라 고도 함)에 사용 할 수 있 습 니 다.
imp 이란 무엇 입 니까?
Python import 구문 체제 에 대한 인 터 페 이 스 를 제공 하 는 imp 라 는 모듈 도 있 습 니 다.이 모듈 은 Python 3.4 에서 거부 되 었 는데,그 목적 은 importlib 만 사용 하기 위 한 것 이다.
이 모듈 은 좀 복잡 하기 때문에 우 리 는 이 박문 에서 주로 다음 과 같은 몇 가지 주 제 를 토론 한다.
동적 도입
•모듈 이 도 입 될 수 있 는 지 확인
•원본 파일 자체 도입
•제3자 모듈 importfrom_github_com
2 모듈 사용
2.1 동적 도입
importlib 모듈 은 모듈 을 도입 하기 위해 문자열 을 입력 하 는 것 을 지원 합 니 다.우 리 는 이 기능 을 검증 하기 위해 두 개의 간단 한 모듈 을 만 들 었 다.우 리 는 그것들 을 구분 할 수 있 도록 두 모듈 에 같은 인 터 페 이 스 를 줄 것 이다.foo.py 와 bar.py 두 모듈 을 만 듭 니 다.코드 는 다음 과 같 습 니 다.

def main():
 print(__name__)
지금 우 리 는 importlib 를 사용 하여 그것들 을 도입 합 니 다.이 코드 가 어떻게 만 들 어 졌 는 지 보 여 주세요.이 코드 를 위 에서 만 든 두 모듈 과 같은 디 렉 터 리 에 두 었 는 지 확인 하 십시오.

#importer.py
import importlib

def dynamic_import(module):
 return importlib.import_module(module)

if __name__ == "__main__":
 module = dynamic_import('foo')
 module.main()

 module_two = dynamic_import('bar')
 module_two()

이 코드 에서 우 리 는 수 동 으로 importlib 모듈 을 도입 하고 간단 한 함수 dynamic 를 만 듭 니 다.import。이 함수 가 하 는 것 은 importlib 모듈 의 import 를 호출 하 는 것 입 니 다.module 함수,입 참 은 우리 가 들 어 온 문자열 입 니 다.그리고 호출 결 과 를 되 돌려 줍 니 다.코드 세그먼트 아래 에서 우 리 는 각 모듈 의 main 방법 을 호출 하여 각 모듈 의 이름 을 인쇄 할 것 입 니 다.
당신 의 코드 에서,당신 은 아마 대량으로 이렇게 하지 않 을 것 입 니 다.문자열 이 하나 밖 에 없 을 때 이 모듈 을 도입 하려 면 importlib 에서 이렇게 할 수 있 습 니 다.
2.2 모듈 도입 검사
Python 의 인 코딩 규범 은 EAPP:Easier to ask for forgiveness than permission 입 니 다.어떤 일이 존재 한다 고 가정 하 는 경우 가 많다 는 뜻 이다.Python 표준 모듈 인 import 글 에서 모듈 을 도입 하려 고 시도 합 니 다.존재 하지 않 을 때 ImportError 를 캡 처 합 니 다.만약 우리 가 하나의 모듈 이 단지 추측 만 하 는 것 이 아니 라 도입 할 수 있 는 지 를 검사 하고 관찰 하고 싶다 면 어떻게 해 야 합 니까?importlib 를 사용 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다:

#coding:utf-8

import importlib.util
import importlib

def check_module(module_name):
 module_spec = importlib.util.find_spec(module_name)
 if module_spec is None:
 print("Module :{} not found".format(module_name))
 return None
 else:
 print("Module:{} can be imported!".format(module_name))
 return module_spec
 
def import_module_from_spec(module_spec):
 module = importlib.util.module_from_spec(module_spec)
 module_spec.loader.exec_module(module)
 return module

if __name__ == "__main__":
 module_spec = check_module("fake_module")
 module_spec = check_module("collections")
 if(module_spec):
 module = import_module_from_spec(module_spec)
 print(dir(module))

여기 서 importlib 모듈 의 하위 모듈 util 을 도입 합 니 다.check 에서module 함수 중,우 리 는 find 를 호출 합 니 다.spec 함 수 는 들 어 오 는 문자열 이 모듈 로 존재 하 는 지 확인 합 니 다.우선,우 리 는 가짜 이름 을 입력 한 후에 Python 모듈 의 실제 이름 을 입력 합 니 다.이 코드 를 실행 하면 설치 되 지 않 은 모듈 의 이름 을 볼 수 있 습 니 다.findspec 함 수 는 None 로 돌아 갑 니 다.이 모듈 을 찾 을 수 없 는 코드 를 출력 합 니 다.만약 찾 으 면 우 리 는 모듈 의 설명 을 되 돌려 줄 것 이다.
우 리 는 모듈 의 설명 을 얻 은 후에 그것 을 사용 하여 모듈 을 진정 으로 도입 할 수 있다.아니면 import 에 문자열 을 전송 할 수 있 습 니 다.module 함수 에서 우리 가 2.1 절 에서 배 운 것 처럼.그러나 우 리 는 모듈 을 어떻게 사용 하 는 지 에 대한 설명 을 배 웠 다.위 코드 의 import 를 보 여 주세요.module_from_spec 함수.받 아들 이 는 것 은 checkmodule 함수 가 돌아 오 는 모듈 설명.우 리 는 그것 을 module 에 전달한다.from_spec 함수,도입 모듈 을 되 돌려 줍 니 다.Python 의 공식 문 서 는 모듈 을 도입 한 후에 실행 하 는 것 을 추천 합 니 다.그래서 다음 단 계 는 exec 를 호출 하 는 것 입 니 다.모듈 함수.마지막 으로 우 리 는 이 모듈 로 돌아 가 Python 의 dir 함 수 를 실행 하여 이것 이 우리 가 원 하 는 것 임 을 확인 합 니 다.
2.3 원본 파일 에서 도입
이 절 에서 importlib 의 하위 모듈 util 에 또 다른 기술 이 있다 는 것 을 설명 하고 싶 습 니 다.모듈 이름과 파일 경 로 를 통 해 모듈 을 도입 할 수 있 습 니 다.예 는 다음 과 같다.

#coding:utf-8

import importlib.util

def import_source(module_name):
 module_file_path = module_name.__file__
 module_name = module_name.__name__
 
 module_spec = importlib.util.spec_from_file_location(module_name,module_file_path)
 module = importlib.util.module_from_spec(module_spec)
 module_spec.loader.exec_module(module)
 print(dir(module))

 msg = "The {module_name} module has the following methods:{methods}"
 print(msg.format(module_name = module_name,methods = dir(module)))
 
if __name__ == "__main__":
 import logging
 import_source(logging)

상기 코드 에서 우 리 는 실제로 logging 모듈 을 도입 하여 import 에 전송 합 니 다.source 함수.이 함수 에서 우 리 는 먼저 모듈 의 실제 경로 와 이름 을 가 져 옵 니 다.그리고 우 리 는 이 정 보 를 util 의 spec 에 전달 합 니 다.from_file_location 함수 에서 이것 은 모듈 의 설명 을 되 돌려 줍 니 다.모듈 에 대한 설명 을 얻 으 면 2.2 절 과 같은 importlib 체 제 를 사용 하여 모듈 을 실제 도입 할 수 있 습 니 다.
이제 정교 한 제3자 라 이브 러 리,Python 의import__()함수 가 github 의 가방 을 직접 도입 합 니 다.
2.4 import_from_github_com
이 정교 한 가방 을 import 라 고 합 니 다.from_github_com,github 의 가방 을 발견 하고 다운로드 하 는 데 사용 할 수 있 습 니 다.그 를 설치 하기 위해 서 당신 이 해 야 할 일 은 다음 명령 에 따라 pip 를 사용 하 는 것 입 니 다.

pip install import_from_github_com

이 가방 은 PEP 302 의 새로운 도입 고 리 를 사용 하여 github 에서 가방 을 도입 할 수 있 도록 합 니 다.이 가방 은 실제로 이 가방 을 설치 하고 로 컬 에 추가 하 는 것 입 니 다.Python 3.2 또는 더 높 은 버 전이 필요 합 니 다.git 와 pip 에서 만 이 가방 을 사용 할 수 있 습 니 다.
이것 이 설치 되 어 있 으 면 Python 셸 에 다음 명령 을 입력 할 수 있 습 니 다.

>>> from github_com.zzzeek import sqlalchemy
Collecting git+https://github.com/zzzeek/sqlalchemy
Cloning https://github.com/zzzeek/sqlalchemy to /tmp/pip-acfv7t06-build
Installing collected packages: SQLAlchemy
Running setup.py install for SQLAlchemy ... done
Successfully installed SQLAlchemy-1.1.0b1.dev0
>>> locals()
{'__builtins__': <module 'builtins' (built-in)>, '__spec__': None,
'__package__': None, '__doc__': None, '__name__': '__main__',
'sqlalchemy': <module 'sqlalchemy' from '/usr/local/lib/python3.5/site-packages/\
sqlalchemy/__init__.py'>,
'__loader__': <class '_frozen_importlib.BuiltinImporter'>}
import 를 봤 다 면from_github_come 의 소스 코드 는 importlib 를 사용 하지 않 았 음 을 알 게 될 것 입 니 다.실제로 설치 되 지 않 은 가방 을 설치 하고 Python 의 를 사용 합 니 다.import__()함수 가 새로 설 치 된 모듈 을 도입 합 니 다.이 코드 는 매우 배 울 만하 다.
2.5 총화
코드 에서 importlib 를 어떻게 사용 하고 갈 고 리 를 도입 하 는 지 알 게 되 었 습 니 다.물론 본문 이 덮어 쓰 는 것 을 뛰 어 넘 는 지식 도 많 습 니 다.사용자 정의 도입 기 나 다운로드 기 를 써 야 한다 면 공식 문서 와 소스 코드 를 읽 는 데 많은 시간 이 필요 합 니 다.

좋은 웹페이지 즐겨찾기