파이썬) import문이 모듈과 패키지를 찾는 방법

김건우·2020년 7월 22일
1
post-custom-banner

1. sys.modules 와 sys.path

1. sys.modules

  • 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳이다.
  • sys.modules 의 타입은 dictionary 이다.
  • 이미 import된 모듈과 패키지들을 저장하고 있다.
  • 한번 import된 모듈과 패키지들은 또 다시 찾지 않도록 해준다.
  • 새로 import 하는 모듈은 찾을 수 없다.

2. sys.path

  • 파이썬이 모듈이나 패키지를 찾기 위해 가장 마지막으로 확인하는 곳
  • sys.path의 타입은 string요소들을 가진 list 이다. (List['string'])
  • 경로를 나타내는 string 요소들이다.
  • 파이썬은 각 경로를 하나 하나 확인하면서 해당 경로에 import하고자 하는 패키지가 위치해 있는지 확인한다.

3. sys란

  • 파이썬에 포함되어 있는 모듈이다.

4. 모듈과 패키지 찾는 순서

import 준비 -> sys.modules -> built-in 모듈 확인 -> sys.path

  • sys.path 에서도 찾지 못하면, ModuleNotFoundError 를 리턴한다.

2. 파이썬이 sys 모듈의 위치를 찾는법.

Q) 파이썬이 모듈과 패키지를 찾는 방법으로 sys모듈을 사용한다.
그런데 sys 또한 모듈인데 파이썬이 어떻게 찾을까?

  • built-in 모듈
  • built-in 모듈이란, 해석 그대로 이미 파이썬에 내장되어 있는 모듈이다.
  • 파이썬은 모듈을 찾는 순서 2번째로, built-in 모듈을 확인하게 되는데 이때 이미 파이썬에 내장되어 있는 "sys"를 발견하게 된다.

3. Absolute path와 relative path의 차이점

1. Absolute path (절대 경로)

  • 절대 경로는 import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다는 뜻이다,
  • 위의 my_app 프로젝트에는 package1,package2가 있고 그 아래 모듈이 존재한다.

    만일 module5.py 에 function2 함수를 불러온다고 한다면

from package2.subpackage1.module5 import function2

Q) my_app 을 적지 않는 이유는 무엇일까?

  • 위와 같이 module.py에 function2에 접근하기 위한 경로를 리눅스 directory로 표현한다면 다음과 같다.
my_app/package2/subpackage1/module5.py

파이썬에서 from import 키워드를 사용하게 되면, 이미 my_app프로젝트에서 출발하기 때문에, my_app은 적지 않는다.

정리

  • my_app 프로젝트 내에서는 어느 파일, 어느위에서 import 하던지 경로가 항상 위와 같기 때문에 absolute path 라고 한다.

2. Relative path(상대 경로)

  • 절대경로와의 가장 큰 차이점은 "기준" 이다.

  • 절대경로 처럼, 최상단 디렉토리를 기준으로 경로를 잡는 것이 아닌,

    import하는 위치를 기준으로 경로를 정의한다.

  • package2의 module3 에서 package2의 subpackage1의 module5의 function2 함수를 import 한다면,

from .subpackage1.module5 import function2
  • 여기서 dot(.)은 import가 선언되는 파일의 현재 위치 이다.

4. calculator 패키지 만들고 실습하기

main.py

add_and_multiply.py

multiplication.py

패키지 구성

4-1. calculator 패키지의 오류

  • 현재 main.py에서 상대경로로 add_and_multipl면y를 임포트 했을 때 오류가 발생하고 있다.


    오류의 내용을 확인해 보면,
    ImportError : 부모 패키지에 없는 import를 가지고 왔다.

오류 해결)

  • main.py에서 현재 from .calculator로 시작 하고 있음을 알 수 드있다.
  • dot(.)은 상대 경로를 지정하는데, calculator는 최상위 패키지 이다.
  • 절대 경로를 지정해 줌으로 오류를 해결 할 수 있다.

    수정코드)

    결과)

4-2. add_and_multiply.py 에서 multiply함수 "절대경로" 와 "상대경로"로 임포트 해보고, main 모듈과 차이점 생각하기.

  • add_and_multiply.py의 경우 calculator 패키지의 모듈중 하나이다.

  • main.py는 add_and_multiply.py모듈을 받아 실행시키는 파일이다.


  • 패키지 모듈과, 실행파일이라는 차이점에서 발생하는 결과값
    • add_and_multiply.py 절대 경로 실행

      결과: 실행가능
    • add_and_multiply.py 상대 경로 실행

      결과: 오류
  • add_and_muliply.py 가 절대경로 일때, main.py의 실행 여부

    결과: multiplication 모듈을 찾을 수 없다고 한다.
  • add_and_multiply.py가 상대경로 일때, main.py의 실행여부

    결과: 실행

  • main.py의 실행과정을 생각해 본다면, calculator패키지의 add_and_multiply.py 모듈에서, multiplication.py의 multiply함수를 가져와 실행하게 된다.

결론)

  • 절대경로의 경우 최상위 부터 읽어야 하기 때문에, multiplication만 적으면 실행이 되지 않는다. 상위인 caculator 부터 읽어와야지 정상 작동 된다.
  • 절대경로를 사용할 경우 직관적으로 패키지와 모듈을 더 쉽게 이해하고 수정할 수 있다.

4-3 init.py의 역할

  • init.py : 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.

  • python 3.3 버전부터는 init.py 파일이 없어도 패키지로 인식된다.

  • 하지만 하위 버전 호환을 위해 init.py 파일을 생성하는 것이 안전한 방법이다.

profile
꾸준하게 공부하기
post-custom-banner

0개의 댓글