Python- How Import Statement Finds Modules & Packages

김경천·2021년 5월 19일
0

sys

sys(System-specific parameters and functions) 인터프리터에 의해서 사용되거나 관리되는 변수와 함수에 대한 접근을 항상 제공하는 모듈이다.

우리는 import를 통해 사용하고 싶은 모듈과 패키지를 손 쉽게 사용할 수있다.파이썬은 다음 3가지 장소를 순서대로 보면서 모듈과 패키지를 검색한다.

  • sys.modules
  • built-in moules
  • sys.path

순서대로 접근한다.

컴파일링 언어와 인터프리터 언어

프로그래밍 언어는 컴파일링 언어와 인터프리터 언어로 나눌 수 있다.
파이썬은 인터 프리터 언어이다.

컴파일 언어

한 번에 컴파일링 하므로 "구조"가 중요하다.
그래서 "객체지향성 언어"가 발전되었다,

인터프리터 언어

명렁어 한줄씩 컴파일링 되기 때문에 명렁어 한줄 한줄이 중요하다.
그래서 Markdown형식의 Jupiter같은 것이 개발되었다.
인터 프리터는 한줄 명령어 단위이므로 명령 한줄이 <함수> 인 경우가 많다.
그래서 "함수 언어"라 부르기도 한다.

sys.modules

파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳입니다. dic형태의 자료구조로 경로를 나타낸다
{모듈이름: 모듈경로}

built-in modules

파이썬에서 제공하는 파이썬 공식 라이브러리들이다.이미 파이썬 설치때 포함되어 있기 때문에 따로 설치하지 않아도 사용가능하다.

sys.path

만약 찾고자 하는 모듈과 패키지가 sys.modules 과 built-in modules에도 없으면 마지막으로 보는 장소가 바로 sys.path 입니다. list 자료구조 형으로 경로를 나타낸다. 만약 이곳에서도 모듈과 패키지를 찾지 못한다면 ModuleNotFoundError 을 반환한다.

'',
 '/Users/song-eun-u/anaconda3/bin',
 '/Users/song-eun-u/anaconda3/lib/python36.zip',
 '/Users/song-eun-u/anaconda3/lib/python3.6',
 '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
 '/Users/song-eun-u/.ipython']

그러므로 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인합니다.

Absolute Path vs Relative Path

컴퓨터에서 파일의 위치를 나타낼때 절대경로와 상대경로로 위치를 나타낼 수 있다.

Absolute Path (절대경로)

import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.
경로들의 시작점이 가장 최상위 디렉토리에서 시작하며 파일의 우치까지의 모든 디렉토리의 경로를 표시할수있따.
module5.py파일의 절대경로

my_app/package2/subpackage1/module5.py

Relative Path (상대경로)

absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용됩니다.

만약 현재위치가 블로그이라면

/Users/Amuse/Desktop/Dev/miniProjects/blog/

'../' 상위 디렉토리(miniProjects) 를 표시한 방법이다.

../
'../../' 두단계 상위 디렉토리(Dev) 를 표시한 방법이다.

../../


sys.moules와 sys.pathdml 차이점

sys.moudle

  • 파이썬이 제일먼저 모듈이나 패키지를 찾는곳이다.
  • 딕셔너리구조이다.
  • import 되있는 모듈과 패키지 저장한다. (다시 찾지 않아도 됨)

sys.path

  • 모듈과 패키지를 찾은후 마지막으로 sys.path를 찾는다.
  • 리스트 구조이다/
  • 처음의 리스트요소부터 마지막까지 찾는다
  • 파이썬에 포함되어 있는 built-in modules이다.
  • sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError 에러를 리턴한다.

sys도 import해야하는 모듈이다. sys모듈의 위치를 찾는방법

sys모듈은 이미 built-in 되어 있기 때문에 built-in module들이 있는 부분에서 찾게 된다.

import sys

print(sys.modles)
->{'sys': <module 'sys' (built-in)>

Absolute path와 relative path의 차이점을 서술

Absolute path

절대 경로이다.
경로들의 시작점이 최상단 디렉토리이다.

relative path

상대 경로이다.
import 하는 위치를 기준으로 경로를 잡는다.

일반적으로 local package를 import 할 때 absolute path를 사용하면 된다. 다만, 경로가 길어질 수 있다는 단점이 있다.
relative path은 선언해야하는 경로의 길이를 줄여주는 장점은 있지만 헷갈리 쉬우며 파일 위차가 변경되면 경로 위치도 변경되어야 하는 단점이 있다.

main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트

ImportError: attempted relative import with no known parent package

상대경로로 접근하면 에러가 뜬다. 그 이유는 main.py가 최상위 에 위치해 있기 때문이여서 절대경로로 접근해야 한다.

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점

add_and_multiply.py 는 패키지 안에 있는 모듈로 절대경로와 상대경로 모두 정상적으로 출력되며, main.py는 스크립트이고 패키지 안에 포함되지 않았기 때문에 절대경로만 실행이 된다.

init.py 파일의 역할

init.py 파일에는 아무 코드도 없지만 init파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다. 만약 add_and_multiply.py와 multiplication.py 패키지에 포함된 디렉터리에 init.py파일이 없다면 패키지로 인식되지 않는다.
또한 이름 그대로 패키지를 초기화하는 역할을 한다. 즉, import로 패키지를 가져오면 init.py파일이 실행되므로 이 파일에서 from.import모듈 형식으로 현재 패키지에서 모듈을 가져오게 만들어야 한다.

profile
화이팅

0개의 댓글