python 에서 모듈 찾기 의 원리 와 방법 에 대한 상세 한 설명

머리말
본 고 는 주로 python 모듈 에서 찾 는 원리 와 방식 을 소개 하고 여러분 에 게 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 고 상세 한 소 개 를 하 겠 습 니 다.
기초 개념
module
모듈,py 파일 또는 다른 파일 형식 으로 존재 하 는 가 져 올 수 있 는 모듈
package
가방,포함init__ 파일 의 폴 더
relative path
상대 경로
absolute path
절대 경로
경로 찾기
python 해석 기 도입 패키지 나 모듈 찾기
Python 해석 기 는 가방 과 모듈 을 어떻게 찾 습 니까?
Python 은 py 파일 을 실행 합 니 다.실행 방식 이 절대적 인 경로 든 상대 적 인 경로 든 interpreter 는 파일 이 있 는 directory 를 추가 합 니 다sys.path.이 list 에서 Python 은sys.path 에서 가방 과 모듈 을 찾 습 니 다.sys.path의 내용 자 체 는 Python 의 환경 변 수 를 결정 합 니 다.
code-1

#test.py
import os
import sys
print sys.path[0]
# execute
python test.py
python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test.py
실행 은 상대 적 인 경로 와 절대 경로 가 같은 결 과 를 출력 하 는 것 을 나타 내 고 어떤 실행 방식 이 든 test.py 가 있 는 폴 더 는sys.path의 1 위,즉 색인 이 0 인 위치 에 추 가 됩 니 다.
Python 해석 기 가방 찾기 순서 가 뭐 예요?
해석 기 찾기 패 키 지 는 먼저 built-in module 을 검색 한 다음 검색sys.path을 하면 같은 이름 의 패키지 나 모듈 이 가 려 집 니 다.
code-2

#ls
├── os.py
├── test2.py
├── redis.py
#test2.py
import os
from redis import Redis
#execute test2.py
Traceback (most recent call last):
 File "/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test2.py", line 1, in <module>
 from redis import Redis
ImportError: cannot import name Redis
os 는 built-in module 이기 때문에 같은 디 렉 터 리 에 같은 이름 의 모듈 이 있 더 라 도 해석 기 는 정확 한 os 모듈 을 찾 을 수 있 습 니 다.built-in module 은 가 려 지지 않 고 redis 는 제3자 모듈 에 속 합 니 다.기본 설치 위 치 는 Python 환경 변수 중의 site-packages 입 니 다.해석 기 가 시작 되면 이 디 렉 터 리 의 내용 을 추가 합 니 다sys.path.현재 디 렉 터 리 가sys.path의 첫 번 째 이기 때문에 현재 디 렉 터 리 의 redis 를 우선 찾 을 수 있 습 니 다.site-packages 의 redis 모듈 이 가 려 졌 습 니 다.
대화 형 실행 환경의 검색 순서
대화 식 실행 환경 에 들 어가 면 해석 기 는 현재 디 렉 터 리 를 자동 으로 추가 합 니 다sys.path.이때 현재 디 렉 터 리 는 상대 적 인 경로 로sys.path 에 나타 납 니 다.

>>> import os.path
>>> import sys
>>> os.path.abspath(sys.path[0])
'/Users/x/workspace/blog-code'
>>>
그 밖 에 다른 것 은 하나의 파일 을 실행 하 는 것 과 같다.
모듈 의file__ 변량
__file__ is the pathname of the file from which the module was loaded,if it was loaded from a file.한 모듈 이 파일 에서 불 러 오 면file__ 바로 이 모듈 의 경로 명 CPython Doc입 니 다.
말 그대로 모듈 이 파일 로 나타 날 때file__ 모듈 파일 의 경로 이름 을 가리 키 며 상대 경로 로 실행file__ 상대 경로 입 니 다.절대 경로 로 실행file__ 절대 경로 입 니 다.

#test3.py
print __file__
#      
python test3.py
test3.py
#      
python /Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/test3.py
보증 을 위해file__ 매번 모듈 의 정확 한 위 치 를 정확하게 얻 을 수 있 으 므 로 절대 경로os.path.abspath(__file__) 를 다시 찾 는 것 이 좋 습 니 다.
대화 식 셸 의file__

>>> __file__
Traceback (most recent call last):
 File "<input>", line 1, in <module>
NameError: name '__file__' is not defined
이것 은 현재 대화 식 셸 의 실행 이 파일 로 불 러 오 는 것 이 아니 기 때문에 가 존재 하지 않 습 니 다.file__ 이러한 속성.
sys.argv[0]변수sys.argv[0] 주 입구 실행 파일 을 가 져 오 는 데 사 용 됩 니 다.

#test.py
import sys
print __file__
print sys.argv[0]
주 실행 파일 과file__소속 모듈 은 같은 것 입 니 다.입구 파일 을 바 꾸 면 차이 가 발생 합 니 다.

#test.py
import sys
print __file__
print sys.argv[0]
#test2.py
import test
#execute test2.py
/Users/x/workspace/blog-code/p2016_05_28_python_path_find/child/test.py #__file__
test2.py #sys.argv[0]
전체적으로 말 하면sys.argv[0]입구 실행 파일 경 로 를 얻 는 것 입 니 다.file__ 임의의 모듈 파일 을 가 져 오 는 경로 입 니 다.
sys.modules 의 역할
Python 이sys.path 에서 모듈 을 검색 한 이상 불 러 온 모듈 은 어디 에 저장 합 니까?정 답 은sys.modules이다.모듈 이 불 러 오 면 Python 은 이 모듈 을 다음 에 불 러 올 수 있 도록 추가 합 니 다.그러면 모듈 의 도입 을 가속 화하 고 캐 시 역할 을 합 니 다.

>>> import sys
>>> sys.modules['tornado']
Traceback (most recent call last):
 File "<input>", line 1, in <module>
KeyError: 'tornado'
>>> import tornado
>>> sys.modules['tornado']
<module 'tornado' from '/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'>
앞에서 말 했 듯 이 Python 해석 기 가 시 작 된 후에 built-in module 을 미리 불 러 옵 니 다.sys.modules 검증 을 통과 할 수 있 습 니 다.

>>> sys.modules['os']
<module 'os' from '/Users/x/python_dev/lib/python2.7/os.pyc'>
>>>
빌 림sys.modules 과file__,불 러 온 모듈 디 렉 터 리 와 경 로 를 동적 으로 가 져 올 수 있 습 니 다.

>>> import os
>>> os.path.realpath(sys.modules['os'].__file__)
'/Users/x/python_dev/lib/python2.7/os.pyc'
>>> import tornado
>>> os.path.realpath(sys.modules['tornado'].__file__)
'/Users/x/python_dev/lib/python2.7/site-packages/tornado/__init__.pyc'

def get_module_dir(name):
 path = getattr(sys.modules[name], '__file__', None)
 if not path
 raise AttributeError('module %s has not attribute __file__'%name)
 return os.path.dirname(os.path.abspath(path))
summary
전체적으로 말 하면 Python 은 찾기 sys.modules 를 통 해 가방 의 가 져 오기 를 결정 하고 시스템 패키지 우선 순위>같은 디 렉 터 리>sys.path,Python 의 특유 한 속성file__ 그리고sys.path,sys.argv[0]가방 의 검색 과 도입 개념 을 이해 하 는 데 도움 을 줄 수 있 습 니 다.sys.modules의 역할 과 행 위 를 정확하게 이해 할 수만 있다 면 가방 의 검색 을 이해 하 는 것 은 어 려 운 문제 가 아 닙 니 다.
글 의 모든 코드 참조:github
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기