[Python] how import statement finds moduless & packages

김영환·2020년 10월 26일
0

Python

목록 보기
2/11
post-thumbnail

Library

전 세계의 파이썬 사용자들이 만든 유용한 프로그램을 모아 놓은 것이 바로 파이썬 라이브러리다.
"라이브러리"는 "도서관"이라는 뜻 그대로 원하는 정보를 찾아보는 곳이다. 모든 라이브러리를 다 알 필요는 없고 어떤 일을 할 때 어떤 라이브러리를 사용해야 한다는 정도만 알고 있으면 된다. 그러기 위해서는 어떤 라이브러리가 존재하고 어떻게 사용되는지 알아야 한다. 자주 사용하고 꼭 알아 두면 좋은 라이브러리를 중심으로 하나씩 살펴보자.

sys (System-specific parameters and functions)

sys는 파이썬에서 제공하는 모듈이다. os모듈안에 있고, 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다. c언어로 작성되어 있다. 또한 sys는 built-in 되어 있으므로 bulit-in-modules에서 찾을 수 있다.

bulit-in-modules : 파이썬에서 제공하는 공식 라이브러리

sys.moudles 와 sys.path의 차이점

sys.moudles

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

sys.path

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

sys 도 import 해야하는 모듈 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

파이썬에서는 아래와 같은 순서로 module/package를 찾는다.
sys.modules -> bulit-in-modules -> sys.path

Absolute path와 relative path의 차이점

Absolute path

절대 경로는 기존 작업 디렉토리에 관계없이 파일 또는 폴더 위를 ..으로 설명하는 경로입니다.
사실 그것은 루트 디렉토리에 상대적입니다. 파일 또는 디렉토리의 전체 위치를 포함하는 이름입니다. 
또한 절대 경로 이름 또는 전체 경로라고하며 항상 동일한 위치, 즉 루트 디렉토리로 시작합니다.
절대 경로에는 절대 URL에 지정된 자원을 찾는데 필요한 모든 정보가 포함됩니다.
다른 도메인에있는 웹 사이트에 엑세스하려면 도메인에서 절대 경로를 사용해야합니다
from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

원도우스 : my_app/package2/subpackage1/module5.py
파이썬 : my_app/package2.subpackage1.module5.py
파이썬에서는 slash(/) 대신 dot(.) 으로 표현하고 이미 my_app 프로젝트 안에 있으므로 my_app은 생략됩니다. 그러므로 다음처럼 경로를 표현하게 된다 .
package2.subpackage1.module5.py
이걸 from import 키워드를 사용해 import 하게 되면 다음처럼해보면
from package2.subpackage1.module5 import function2

Relative path

상대 경로는 현재 작업 디렉토리를 기준으로 파일 또는 폴더의 위치를 설명하는 경로입니다.
문서가 서로의 관계를 변경하지 않는 특정 웹 사이트 섹션은 동일한 도메인 내에있는 웹 사이트를 
참조하는데 가장 좋습니다. 졀대 경로와 달리 상대 경로에는 단일 웹 사이트 내의 기존 문서에
대한 완전한 정보만 포함되므로 완전한 절대 경로를 제공 할 필요가 없습니다. 간단히 말해 상대
경로는 현재 웹 페이지의 위치에 상대적인 경로르 나타냅니다. 즉, 최상단 디렉토리를 기준으로 
경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다.
# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

여기서 dot(.)은 import가 선언되는 파일의 현재 위치를 이야기 합니다. 현재위치는 pakage2/module3.py 이므로 현재 위치에서부터 원하는 모듈의 경로만 선언해주면된다.

# subpackage1/module5.py
from ..module4 import class4

Relaive path는 선언해야 하는 경로의 길이를 줄여준다는 장점이 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다. 그러므로 웬만한 경우 절대 경로를 사용하는 것을 권장 됩니다.

Path

문서에서 다른 문서로 연결(link)하거나 문서 내에 그림 또는 음악 등 각종 파일을 넣을 때,
문서에는 다른 문서로 연결할 때 다른 문서의 위치나 그림을 넣을 때 사용되는 그림의 위치를 
브라우저에게 알려준다.

calculator 패키지 만들기

main.py

# absoulte path
#from calculator.add_and_multiply import add_and_multiply 

# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

add_and_multiply.py

from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
    return multiply(a,b) + (a+b)

multiplication.py

def multiply(a,b):
    return(a*b)

__init__.py 파일의 역할에 대해서도 정리

해당 파일의 코드가 실행되기 전에 패키지를 보관하는 디렉토리의 이름을 포함하는 목록으로 초기화됩니다. 이 변수는 수정 할 수 있다

0개의 댓글