>  기사  >  백엔드 개발  >  Python에서 import reload __import__의 사용법 차이점을 비교하십시오.

Python에서 import reload __import__의 사용법 차이점을 비교하십시오.

巴扎黑
巴扎黑원래의
2017-09-19 10:45:101790검색

import

기능: .py 파일과 __init__.py 파일(사용자 정의 모듈)이 있는 디렉터리를 포함하는 Python 표준 모듈을 가져오거나 도입합니다.

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

기능: 로드된 모듈을 다시 로드합니다. 일반적으로 원본 모듈의 변경과 같은 특별한 상황에서 사용됩니다. Pass를 다시 로드하기 전에 모듈을 가져와야 합니다. .

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라는 모듈을 저장하기 위한 별도의 장소가 있습니다. , 기본적으로 일부 추가 모듈이 로드되고 다음 단계는 가져오기 취소임을 나타냅니다.

아아아아

위 내용은 Python에서 import reload __import__의 사용법 차이점을 비교하십시오.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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