>  기사  >  백엔드 개발  >  Python에서 import, reload 및 __import__의 차이점에 대한 자세한 설명

Python에서 import, reload 및 __import__의 차이점에 대한 자세한 설명

黄舟
黄舟원래의
2017-10-16 11:04:241498검색

이 글은 주로 Python에서 import reload __import__의 차이점에 대한 자세한 설명을 소개합니다. 필요한 친구들은 참고하시면 됩니다

import

기능: .py를 포함한 Python 표준 모듈 가져오기/소개 파일, __init__.py 파일이 있는 디렉터리(사용자 정의 모듈).


import module_name[,module1,...] 
from module import *|child[,child1,...]

참고: import 문을 여러 번 재사용하면 지정된 모듈이 다시 로드되지 않지만 모듈의 메모리 주소는 지역 변수 환경을 참조합니다.

예:

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print 'in pythontab',id(os)

test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次会打印pythontab里面的语句 
import os #再次导入os后,其内存地址和pythontab里面的是一样的,因此这里只是对os的本地引用 
print 'in c',id(os) 
import pythontab #第二次不会打印pythontab里面的语句,因为没有重新加载

reload

기능: 로드된 모듈을 다시 로드합니다. 일반적으로 원래 모듈의 변경과 같은 특수한 상황에 사용됩니다. 모듈을 다시 로드합니다. 이전에 수입되었어야 합니다.


import os
reload(os)

참고:

reload는 로드된 모듈을 다시 로드하지만 원래 인스턴스는 여전히 이전 모듈을 사용하고 새로 생성된 인스턴스는 다시 로드한 후 새 모듈을 사용하며 원래 메모리는 계속 사용됩니다. ;에서 지원할 수 없습니다. . 수입. . 형식 모듈이 다시 로드됩니다.

예:

pythontab.py


#!/usr/bin/env python  
#encoding: utf-8 
import os 
print 'in pythontab',id(os)

test.py


#!/usr/bin/env python  
#encoding: utf-8 
import pythontab  #第一次import会打印pythontab里面的语句 
print id(pythontab) #原来pythontab的内存地址 
reload(pythontab) #第二次reload还会打印pythontab里面的语句,因为有重新加载 
print id(pythontab) #reload后pythontab的内存地址,和原来一样

확장:

위에서 언급했듯이 다시 로드 기능은 원본 모듈 파일이 다음과 같은 경우를 제외하고 특별한 상황에서만 사용됩니다. 수정되었습니다. 다시 로드 기능을 사용해야 하는 다른 상황은 무엇입니까?


#!/usr/bin/env python  
#encoding: utf-8 
import sys  #引用sys模块进来,并不是进行sys的第一次加载 
reload(sys) #重新加载sys 
sys.setdefaultencoding('utf8') ##调用setdefaultencoding函数

위 코드는 맞고, 다음 코드를 테스트해 보세요.


#!/usr/bin/env python  
#encoding: utf-8 
import sys   
sys.setdefaultencoding('utf8')

위 테스트는 실패하는데 왜 setdefaultencoding을 호출할 때 sys 모듈을 먼저 다시 로드해야 할까요? 여기서 import 문은 실제로 sys의 첫 번째 import 문이 아니기 때문에 이는 실제로 sys 모듈의 두 번째 또는 세 번째 import 문일 수 있으며 sys에 대한 참조일 뿐이며 다시 로드해야만 다시 로드할 수 있습니다. 그렇다면 다시 로드해야 하는 이유는 무엇입니까? 직접 참조하면 함수를 호출할 수 없습니다. setdefaultencoding 함수는 시스템에서 호출된 후 삭제되므로 가져오기를 통해 참조할 때 더 이상 존재하지 않습니다. 따라서 setdefaultencoding을 사용할 수 있고 인터프리터의 현재 문자 인코딩을 사용할 수 있도록 sys 모듈을 한 번 다시 로드해야 합니다. 코드에서 수정되었습니다. 다음 코드를 시도하면 동일한 오류가 보고됩니다.


#!/usr/bin/env python  
#encoding: utf-8 
import sys  
reload(sys)  
sys.setdefaultencoding('utf8')  
del sys.setdefaultencoding  ##删除原来的setdefaultencoding函数   
sys.setdefaultencoding('gb2312')

그럼 이전에 sys를 가져오고 setdefaultencoding 함수를 호출한 사람은 누구입니까? 대답은 Python 설치 디렉터리의 Lib 폴더에 있습니다. site.py [python2.6] 파일에는 main() --> setencoding() -->sys.setdefaultencoding(이 있습니다. 인코딩), 이 site.py는 파이썬 인터프리터가 시작될 때마다 자동으로 로드되므로 메인 함수는 매번 실행되고, setdefaultencoding 함수는 나오자마자 삭제됩니다.

__import__

함수:

import 문과 동일한 함수이지만 __import__는 함수이고 문자열만 매개변수로 받기 때문에 그 역할을 짐작할 수 있습니다. 실제로 import 문은 가져오기 작업을 수행하기 위해 이 함수를 호출합니다. import sys 209861d5cd2975725c730f519ed6ad71sys = __import__('sys')

사용법:


__import__(module_name[, globals[, locals[, fromlist]]]) #可选参数默认为globals(),locals(),[]
__import__('os')  
__import__('os',globals(),locals(),['path','pip']) #等价于from os import path, pip

설명:

보통 동적 로딩 중에 사용됩니다. 예를 들어, 이 기능은 폴더의 모든 모듈을 로드하고 싶지만 그 아래의 모듈 이름이 자주 변경되는 경우 이 기능을 사용하여 모든 모듈을 동적으로 로드할 수 있습니다. 가장 일반적인 시나리오는 플러그인 기능을 지원하는 것입니다.

확장:

모듈은 문자열을 통해 동적으로 가져올 수 있으므로 문자열을 통해 모듈을 동적으로 다시 로드할 수 있나요? 오류를 직접 보고하려면 reload('os')를 시도해 보세요. 직접 다시 로드할 수는 없지만 먼저 모듈 가져오기를 취소한 다음 __import__를 사용하여 모듈을 다시 로드할 수 있습니다. 이제 unimport 작업이 어떻게 구현되는지 살펴보겠습니다. Python 해석에서는 globals(), locals(), vars(), dir() 및 기타 함수를 통해 현재 환경에 로드된 모듈과 해당 위치를 볼 수 있습니다. 보기만 가능하므로 가져오기를 취소할 수 없습니다. 그러나 sys.modules라는 모듈을 저장하기 위한 별도의 장소가 있습니다. , 기본적으로 일부 추가 모듈이 로드되고 다음 단계는 가져오기 취소임을 나타냅니다.


#!/usr/bin/env python  
#encoding: utf-8 
import sys 
__import__('a')   #第一次导入会打印消息 
del sys.modules['a']  #unimport 
__import__('a')  #再次导入还是会打印消息,因为已经unimport一次了 
__import__('a')  #这次就不会打印消息了

요약

위 내용은 Python에서 import, reload 및 __import__의 차이점에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.