[TIL] # 20 Module

파이썬의 방대한 라이브러리, 내장 함수, 프레임워크 등...
여러가지를 사용 할 때 등장하는 모듈 Module이 무엇인지

모듈

코드들의 집합이죠, 단순한 코드들의 집합이 아니라
( 변수, 함수 , 클래스)를 모아 놓은 파일을 의미 합니다

name.py

name.py 처럼 파이썬 파일 하나가 하나의 모듈입니다

보통 모듈을 사용할 때는

import math
import sys
from collections import deque

이런 식으로 import를 해주어 사용하는데, 파이썬 기준으로
경로를 찾는 기준이 3가지 있습니다

  1. sys.module
  2. built in module
  3. sys.path

만약 3가지 경로중에 찾는 모듈이 없다면

ImportError가 발생하게 됩니다

sys.modules

단순한 dictionary 형태로 존재하고 있으며,

뭔가 많다고요?

네.. 맞아요 굉장히 많습니다

제일 앞부분을 보시면 "{" 로 시작하고, dictionary 형태로 되어있는걸
보시면 됩니다

sys에는 많은 모듈이 존재하며,

sys.path, 알고리즘 풀때 사용하는 sys.stdin, sys.stdout 등등

많이 존재 합니다

built in module

파이썬에서 만들어 놓은 모듈로

파이썬 표준 라이브러리라고 합니다

https://docs.python.org/3/library/

sys.path

우선 sys.path가 어떻게 출력되는지 볼게요

여러 경로가 존재하는데 여기에 존재하는지 확인을 합니다
sys.path를 이용해 경로 변경이 가능합니다

path

이렇게 여러 경로들을 확인했는데,

built in module 에서 sys모듈 찾기

가장 첫번째로 보이는 sys

바로 bulit in module을 이용해서 sys를 찾아 우리가 이용할 수 있게 됩니다
이렇게 각자 경로가 있는데

Custom module을 만들어 모듈을 사용하고 싶다면 어떻게 진행이 될까요?

absolut path

절대적인 경로로 파이썬 파일이 들어잇는
디렉토리를 기준으로 합니다

이런 경우 main.py가 있는 python_path디렉토리를 기준으로
경로를 설정하게 됩니다

relative path

상대적인 경로로

현재 있는 디렉토리를 기준으로 잡습니다

이렇게 디렉토리를 설정하고

실행하면 되는지 테스트 해볼게요

ImportError이 발생하게 됩니다

ImportError 해결방법

절대 경로로 설정 해주면 된다

왜 절대경로로 설정해야만 해결이 가능할까

PEP8에서 살펴보면

암시 적 상대 가져 오기는 절대 사용 해서는 안되며 Python 3에서 제거되었습니다.

이런 구문이 있다
python 3.x 버전에서는 상대경로를 사용해서는 import가 안되는 듯 싶다

https://www.python.org/dev/peps/pep-0008/

반대의 경우도 똑같이 작동한다

init

initialize 해주는 것을 뜻합니다

초기화로 알고 있엇습니다

사전을 검색해봣는데 여기에 쓰인

initialize는 ...을 준비 동작에 들어가게 하다
모듈로 지정을 해준다 라는 뜻으로 해석됩니다

해당 디렉토리가 package 디렉토리라는걸 파이썬에게 알려주는 역할입니다

파이썬 3.3 이후 버전부터는 없어도 import가 가능하지만
파이썬을 이용한다면 대다수의 여론을 따라 "__init__"을 사용해주자

name


if __name__ == "__main__":
	print("hi")

이렇게 되있는 부분을 많이 보셨을텐데

__name__의 역할은 파이썬 인터프리터에서 최초로 시작이 되었는지
판별을 할때 사용됩니다

이러한 구조로 되어있는 디렉토리에서 테스트 해보겠습니다


# hello.py 

print('hello 모듈 시작')
print('hello.py __name__:', __name__)  
print('hello 모듈 끝')

1번

실행을 할 경우 name이 main으로 작동하고 있습니다

2번

# main.py
print('hello.py __name__:', __name__)  

이 경우도 마찬가지로 main으로 나옵니다

여기서 hello.py 를 import한 상태로 진행하게되면

3번

hello의 __name__이 hello로 바뀌어있는 걸 확인 할수 있는데

최초로 실행되지 않게 되면 __name__은
파이썬 파일의 이름을 그대로 가지고 가게 되어있습니다

여기서 또 다른 예를 볼게요
제일 처음 봤던 __name__을 활용해 볼게요

4번


# hello.py
if __name__ =="__main__":
    print('hello 모듈 시작')
    print('hello.py __name__:', __name__)   
    print('hello 모듈 끝')

보이는 것과 같이 3번과 4번의 차이는

if 문 하나인데, hello.py가 최초로 실행이 되는파일이 아니기 때문에
출력을 진행하지 않는 모습이 보입니다

from, import

python docs를 읽으면서 정리한부분입니다

파이썬에서 모듈을 가지고 오는 방법

import ____
from __ import ___

import를 사용해서 모듈, 패키지를 가지고와서 사용하게됩니다

__name__, __main__ 등등...
밑줄로 시작하는 경우 제외하고는 다 가지고 올 수 있습니다

만약 이름이 길거나, 다른 패키지의 모듈이름이 같은 것이 존재한다거나
핡 경우 as를 사용하여 이름을 바꿔 사용 가능합니다

comfile

모듈을 가지고 와서 사용 할 경우 파이썬에서는 모듈을 불러오는 속도를 높이기 위해
pycache를 만들어 각각의 디렉토리에 모듈이 컴파일되어있는 내용을 저장하게 됩니다

__pycache__디렉토리를 만들어 저장

안의 파일에는 컴파일 되어있는 hello에 대한 내용이 있습니다

cache로 저장은 매번 진행?

파이썬에서 컴파일 된 버전과 소스의 수정날짜를 확인하여
오래된 것인지, 코드가 수정이 된 곳이 있는지 확인하여
컴파일을 다시 할지를 결정하게 됩니다

컴파일된 캐시를 확인 안하는 두가지

파이썬이 이렇게 확인을 하는데

확인을 안하는 경우가 2가지 있습니다

  1. 커맨드라인에서 직접로드된 모듈의 경우 확인을 하지 않는다.

  2. 컴파일된 소스모듈은 존재하지만, 소스 모듈은 존재하지 않을때

from , import 의 차이점

from __ import ___

위의 방법을 사용 할 경우

패키지의 서브모듈이나, 클래스, 변수, 함수 등...
__ 이름을 가진 모듈을 제외하고는 전부 가지고 올 수 있다


import ___

import만을 사용하여 가지고 올경우 패키지만 가지고 올 수 있다
클래스, 함수, 변수 등은 가지고 올 수 없다

__all__

패키지 안에 있는 모든 모듈을 가지고 올때는 *을 사용합니다
init.py 파일에


__all__ = [ "module", "module" ] 

가지고 올 모듈을 설정하여 이것들을 가지고 오겠다 선언해주면 됩니다


어제 오늘 머리가 다 빠질거 같은 ... 날인데요
다른 어떤 부분보다 이해하기가 좀 어려웠습니다

한 부분이 이해되서 이제 정리를 하다보면

다른데에서... 그럼 이건 왜 이렇게되지? X 100000000000

그래도... 이해가 되서 다행입니다 😁

좋은 웹페이지 즐겨찾기