Python 가 져 오기 모듈 에서 발생 한 오류 분석

어떤 python 모듈 을 가 져 올 수 없 을 때 모듈 이 설치 되 어 있 지 않 을 수도 있 고,모듈 이 불 러 오 는 과정 에서 실 패 했 을 수도 있 고,순환 가 져 오 는 문제 에 빠 졌 을 수도 있 습 니 다.본문 은 이 문 제 를 상세 하 게 해석 하 였 다.
1.모듈 이 설치 되 지 않 았 거나 경로 가 잘못 되 었 습 니 다.ImportError: No mudule named myModule
두 가지 가능성 이 있 습 니 다.하 나 는 이 모듈 이 설치 되 어 있 지 않 아서 일반적으로 사용 할 수 있 습 니 다.pip install %module_name%
해결 하 겠 습 니 다.때때로 모듈 설치 패키지 이름 은 가 져 올 모듈 이름 과 같 지 않 습 니 다.이 경우 pip search|list 명령 을 통 해 정확 한 가방 을 찾 아 볼 수 있 습 니 다.
다른 경 우 는 패키지 가 설치 되 어 있 지만 현재 실행 중인 프로그램 이 불 러 오 는 경로 가 잘못 되 었 다 는 것 이다.python 이 실 행 될 때 다음 위치 에서 python modules 를 불 러 오 려 고 시도 합 니 다.
*현재 디 렉 터 리
*환경 변수$PYTHONPATH 가 가리 키 는 값 입 니 다.이것 은":"로 구 분 된 문자열 입 니 다.각 하위 문자열 은 파일 시스템 의 경로 입 니 다.
*dist-site-packages 와 같은 표준 라 이브 러 리 디 렉 터 리 입 니 다.
*.pth 파일 에 지정 한 경로 입 니 다..pth 파일 이 존재 한다 면.
python 이 실 행 될 때의 포함 경 로 를 다음 과 같이 볼 수 있 습 니 다.

import sys
print(sys.path)
오류 가 발생 한 스 크 립 트 의 머리 에 이 코드 를 추가 한 다음 콘 솔 에서 인쇄 된 python 라 이브 러 리 경 로 를 확인 하고 설치 패키지 가 상기 경로 에 포함 되 어 있 는 지 확인 합 니 다.
***경로 에 포함 되 지 않 은 모듈 을 아래 방식 으로 임시로 포함 시 킬 수 있 습 니 다:***sys.path.append("path/to/module")또한 셸 창 에서 현재 python 포함 경 로 를 볼 수 있 습 니 다.echo $PYTHONPATH2.존재 하 는 모듈 을 가 져 올 수 없습니다.
가 져 올 모듈 에 native 코드 가 포함 되 어 있 고 native 코드 로 딩(초기 화)에 실 패 했 을 때 이 오류 가 발생 할 수 있 습 니 다.ssl,gevent 등 native 와 관련 된 모듈 을 사용 할 때,대응 하 는 native 프로그램 이 설치 되 어 있 지 않 으 면 이러한 오류 가 발생 할 수 있 습 니 다.
또 다른 오 류 는 상대 경 로 를 사용 하여 가 져 올 때 부모 모듈 을 가 져 오지 못 했 습 니 다.다음 코드 참조:

main.py
mypackage/
  __init__.py
mymodule.py
myothermodule.py
my module.py 는 다음 과 같다.

#!/usr/bin/env python3

# Exported function
def as_int(a):
  return int(a)

# Test function for module 
def _test():
  assert as_int('1') == 1

if __name__ == '__main__':
  _test()
그리고 my othermodule 코드 는 다음 과 같 습 니 다.

#!/usr/bin/env python3

from .mymodule import as_int

# Exported function
def add(a, b):
  return as_int(a) + as_int(b)

# Test function for module 
def _test():
  assert add('1', '1') == 2

if __name__ == '__main__':
  _test()

my package/my othermodule 을 실행 하면 다음 과 같은 오 류 를 보고 합 니 다.
Traceback (most recent call last):
 File "myothermodule.py", line 3, in
   from .mymodule import as_int
SystemError: Parent module '' not loaded, cannot perform relative import
[이 글](\#Relative imports in Python 3)은 더 자세 한 해답 을 내 놓 았 다.
3.반복 가 져 오기
이 오 류 를'circular(or cyclic)imports'라 고 합 니 다.python 만 의 가 져 오기 오류 입 니 다.자바 와 같은 언어 에는 존재 하지 않 습 니 다.
다음 두 개의 파일 이 있다 고 가정 합 니 다.a.py 와 b.py:

#a.py
print "a in"
import sys
print "b imported: %s" % ("b" in sys.modules, )
import b
print "a out"
print b.x
그리고:

#b.py
print "b in"
import a
print "b out"
x = 3
python a.py 를 실행 하면 다음 과 같은 결 과 를 얻 을 수 있 습 니 다.

$ python a.py
a in          
b imported: False
b in
a in
b imported: True
a out
Traceback (most recent call last):
 File "a.py", line 4, in <module>
  import b
 File "/home/shlomme/tmp/x/b.py", line 2, in <module>
  import a
File "/home/shlomme/tmp/x/a.py", line 7, in <module>
  print b.x
AttributeError: 'module' object has no attribute 'x'
이런 상황 이 발생 한 이 유 는 순환 가 져 오기 때문이다.순환 가 져 오기 및 가 져 오 는 과정 에서 python 이 잠 금 동작 을 하 였 으 며,결국 모듈 b 가 져 오지 않 았 을 때 그 이름 을 참조 하 였 습 니 다.
가 져 오기 오류 가 순환 가 져 오기 때 문인 지 판단 합 니 다.스 택 에 두 번 반복 되 는 가 져 오기 가 있 는 지 확인 합 니 다.예 를 들 어 상기 스 택 에서 a.py 가 두 번 나타 나 기 때문에 이 파일 로 인 한 순환 가 져 오기 로 판단 할 수 있 습 니 다.
이 문 제 를 해결 하려 면 모듈 을 하나의 자원 으로 보고 도입 할 모든 모듈 에 대해 번 호 를 매 긴 다음 에 정적 자원 정렬 법 에 따라 순서대로 가 져 오 면 순환 가 져 오 는 것 을 피 할 수 있다.

좋은 웹페이지 즐겨찾기