[Python] 모듈과 참조

짱구석·2020년 10월 23일
0
post-thumbnail

시작하며

오늘은 파이썬에서 모듈이나 패키지가 어떻게 참조가 되는지 알아보겠습니다.

sys.modules & sys.path

o sys.modules

현재 시스템 구동 상황에서 import되어있는 module과 package를 딕셔너리형태로 담고 있다.

import할 때 가장처음 확인 하며 import 중복을 막는다.

o sys.path

패키지들이 담겨있는 경로를 list 형태로 가지고 있다.

o sys.path 와 sys.modules 차이점

  • sys.module은 딕셔너리, sys.path는 리스트
  • sys.module은 새로운 내용이 import되면 딕셔너리에 추가
  • sys.path는 설치환경에 따라 고정적이다(절대경로 사용)

o import 순서

  1. sys.modules
  2. 파이썬 build-in(파이썬 공식 라이브러리 ex) time, math, random)
  3. sys.path
  4. 그래도 없으면 ModuleNotFoundE
if 모듈이 sys.modules에 정의됨? :
	pass
elif 파이썬 build-in 모듈임?:
	sys.modules에 추가
elif sys.path에 있음?:
	sys,modules에 추가 
else:
	error('ModuleNotFoundError')

Absolute path & relative path

Absolute path(절대경로)

  • 프로젝트 최상단 디렉토리를 기준
  • 일반적인 import 시에는 absolute path
  • 경로가 길어진다(단점)

Relative path(상대경로)

  • import 하는 파일의 위치를 기준
  • 파일위치가 변경되면 경로위치도 변경되어야함(단점)
  • 가능하면 absolute를 사용하는 것을 권장

Pakage 만들기

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/9834b510-9955-41f8-84fc-461db16e5693/Untitled.png

다음과 같은 구조의 패키지를 만들어보자

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/efafbf3b-5db3-46e6-af85-fa9ce9be15c8/_2020-10-23_10-13-56.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/59040f55-e6ad-4056-a729-e1dce00048d0/_2020-10-23_10-20-08.png

이대로 main.py를 돌리면 다음과 같은 에러가 나온다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/21707233-d386-43a3-b16d-f8ed53386c5b/_2020-10-23_10-20-39.png

공식문서를 보면 메인으로 사용하는 모듈에서는 모듈의 이름(__name__)이 항상 __main__ 이기 떄문에 절대경로로 참조하여야한다고 나와있다.

__name__ 을 보고 상대경로의 기준을 잡아야하는데 __main__ 이라고 덜렁 되어있으니까 interpretor에서 찾지 못하는 것 같다. ****

이는 메인모듈은 항상 최상위 디렉토리에 두어야한다는 말과 같은 말인 것 같다.

init.py

__init__.py 은 존재만으로 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.

# __init__.py
from .mod1 import func2
from .mod2 import func3

__all__ = ['func2', 'func3']
# main.py
from pkg import *

func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음.

부가적으로 노출을 원하지 않는 함수가 외부에 import 되어 사용되는 것을 막을 수 있습니다.

0개의 댓글