TIL 21.05.16 module

0

TIL

목록 보기
10/29
post-thumbnail

프로젝트를 할 때 한 곳에서 만든 클래스를 다른 곳에서 조회해야 하는 경우가 많아서 모듈에 대해서 꼭 한 번 정리하고 가야할 것 같아서 파이썬에서 모듈을 다룰 때 필요한 사항들을 정리합니다~~~

파이썬의 모듈 조회

sys.module
built-in modules
sys.path

파이썬이 모듈을 조회할 때는 위에 순서대로 조회를 한다.이 순서대로 조회를 해도 찾지 못하면 ModuleNotFoundError 를 리턴한다. (컴터에서 인식하는 에러!)

sys.modules

이미 import된 모듈과 package들이 저장된 공간

한 번 임포트된 모듈과 패키지를 저장해놓아 또 다시 찾지 않도로 하는 기능을 한다. 아직 임포트 전인 모듈과 패키지는 여기서 확인 불가하다!

built-in modules

파이썬 제공 공식 라이프러리

예를 들어서 시간을 알려주는 datetime , json데이터를 파이썬의 딕셔너리형태로 바꿔서 처리할 수 있도록 해주는 'json등이 여기에 속한다!

sys.path

각 모듈과 패키지가 저장된 디렉토리 위치가 저장된 리스트

custom 모듈과 패키지를 여기서 조회할 수 있으며 해당 경로에 임포트하는 패키지가 있으면 import할 수 있다!. (상위 폴더 조회를 할 때 중요!)

들어가는 형태는 각 모듈들이 저장된 경로가 하나의 요소로서 리스트 안에 들어간다!

[ User/mac/anaconda3/lib/python3.7/ .... , User/mac/anaconda3/lib/python3.7/ .... , ..... User/mac/anaconda3/lib/python3.7/ .... ]
이 리스트 안에 직접 패키지 경로를 저장해주면 import가 가능하다!

절대경로 상대경로

대부분의 빌트인 모듈과 pip통해서 설치된 패키지는 임포트하는데 큰 문제가 되지 않지만 직접 개발한 local module은 문제가 생길 수 있다. 그래서 문제가 생길때는 경로를 잘 설정했는지 확인해야한다(실제로 헛고생해버렸어)

우선 실제 프로젝트 디렉토리를 가지고 분석을 해보려고 한다. (tree를 가져오고 싶었지만 django 특성상 프로젝트 하나의 views, urls 등 잔뜩 생기기 때문에 지저분해서 팻흐... ㅠ)

저기서 my_settings는 비공개 정보가 잔뜩 들어있기 때문에 git에도 안올라가도록 한 모듈이다. 따라서 저기에 있는 정보를 다른 파일에서 조회하려고 하면 import 로 사용하려는 객체를 가져오는 방법밖에 없다.

이제 user 폴더에 views에서 이 정보(my_settings)를 조회하고 싶다면 상위 폴더에 있는 my_settings를 import해야 한다.

☀️ 절대경로

최상위 디렉토리 밑으로 위치를 검색하여 조회하는 방식


my_app이라는 최상위 디렉토리 밑에 module2.py를 조회하고자 한다면

from package1 import module2.py
를 입력하면 된다. package1은 my_app 하위 디렉토리이고 그 밑에 module 2가 있기 때문에. 현재 파일이 어디에 위치해있던 조회가 가능하다.

최상위 디렉토리라는 개념이 중요한데 이 부분이 많이 헷갈렸었는데 한 번 삽질을 하고 나니 이해가 되었다!! (삽질은 개발의 어머니)

이제 위 프로젝트 user. views에서 my_settings를 import해서 SECRET_KEY를 가져오고 싶다면 다음과 같이 표현하면 된다.

from my_settings import SECRET_KEY

그렇다! 별다른 경로를 탈 필요 없이 바로 이렇게 하면 조회가 가능하다! 그 이유는 현재 현재 최상위 디렉토리가 sanghyub이라는 my_settings 바로 상위 폴더이기 때문에 상위 폴더 입장에서는 어디로 추가로 들어갈 필요 없이 확인을 하면 되기 때문이다.

최상위 디렉토리는 누가 어떻게 정해줄까??

그러면 최상위 디렉토리는 어떻게 설정되는 걸까?? 일반적으로는 프로젝트 이름으로 구성이 된다고 한다. 지금 사용하는 django에서는 $ django-admin startproject projectname 으로 만들어지는 프로젝틀 폴더가 가장 최상위 디렉토리로 설정이 된다.

최상위 디렉토리보다 밑에 모듈 가져오기!

그래서 대부분 이 폴더보다 상위로 가는 경우보다 밑으로 가는 경우가 많다. 위에 프로젝트에서 현재 내가 user.models에 있을 때 posting.models를 임포트하려면 해당 파일에서
from posting.models import 클래스,함수 를 해서 가져오면 된다. 경로를 표시할 때 /를 사용하는 것처럼 터미널과 유사하게 . 으로 하위 경로를 보여준다. (..는 상위 경로 ../..는 상위 상위 경로)

최상위 디렉토리보다 상위에 모듈 가져오기

사실 위에 서술한 것처럼 프로젝트 밖에 모듈을 가져올 일은 많지 않다. 오히려 내장모듈을 가져오는 경우가 많을 것이다. 그럼에도 사용해야 할 모듈이 있다면 여기에 나와있는 방식으로 진행을 하면 된다.

줄곧 삽질이라고 표현을 하는 이유는 이 상위 모듈 가져오기 방식으로 mysettings를 가져왔기 떄문이다.


이 기다란 코드를 위에 최상위 디렉토리 밑에 모듈 가져오기 방식으로 짧게 줄일 수 있다....

🌙 상대경로

현재 위치해있는 곳 기준으로 상대적으로 표현

절대경로는 계속 입력을 많이 해줘야 해서 낭비가 존재할 수 있다. user.user1.user2........
그래서 현재 위치까지의 디렉토리를 적지 않아도 되는 상대경로를 작성할 수 있다. 이 상대경로는 최상위 디렉토리 기준으로 표시하는 절대경로와 달리 현재 파일의 위치를 기준으로 설정이 되기 때문에 현재내가 위치한 곳을 파악하는 것이 좋다!

현재 파일과 같은 위치 : from .같은위치모듈 import 클래스
현재 파일보다 밑에 위치: from .같은위치모듈.하위 모듈 import 클래스
현재 파일보다 위에 위치: from ..상위위치모듈 import 클래스

다만 상대경로는 파일 위치를 기준으로 하기 때문에 파일 위치가 옮겨진다면 기존에 설정해놓은 import의 경로가 달라질 수 있기 때문에 가능하다면 절대경로로 표현을 해주는 것이 좋다!

profile
기록을 통해 한 걸음씩 성장ing!

0개의 댓글