language/Python
[Python] module, 사용법, if __name__=="__main__": ,package 개념
스파이디웹
2022. 2. 18. 11:40
728x90
1. 모듈(module)이란?
- 함수나 변수 또는 클래스를 모아 놓은 파일
- 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일
- 코드의 특정 부분을 분리해서 따로 모아놓은 것
- 파일 하나를 1개의 모듈로 봄
- import 문을 통해 모듈 사용이 가능
- 가독성을 위해서 맨위에 import문을 넣음
1) 모듈 불러오기
결국 모듈은 파이썬 파일이고 이 모듈을 불러오는 것이 중요
- import 모듈(파이썬 파일명)
- import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있다.(현재 디렉터리의 파이썬 파일, 가상환경 내 site-packages에 있는 파이썬 파일)
-
def add(a, b): return a + b
- 해당 코드가 module1에 있다고 가정 했을 시,
###### import 모듈 형태로 호출 ###### import class_skill_up #class_module_ 패키지의 class_skill_up 모듈을 import해옴 a = class_skill_up.FourCal(5,1)#class_skill_up의 FourCal 클래스를 불러와서 a객체에 저장 print(a.add())#FourCal 클래스의 메소드를 사용 #6출력 #######다음과 같이 모듈을 불러올 수도 있음 from 모듈 import 클래스 or 함수###### from class_skill_up import FourCal#class_module_ 패키지의 class_skill_up 모듈을 import해옴 a = FourCal(5,1)#class_skill_up의 FourCal 클래스를 불러와서 a객체에 저장 print(a.add())#FourCal 클래스의 메소드를 사용 #6출력 ######별칭을 주고 활용할 수 있다.###### from class_skill_up import FourCal as F#class_module_ 패키지의 class_skill_up 모듈을 import해옴 a = F(5,1)#class_skill_up의 FourCal 클래스를 불러와서 a객체에 저장 print(a.add())#FourCal 클래스의 메소드를 사용 #6출력
- 다른 파일에서 모듈 불러오기
다른 파일에서 모듈을 불러올 때에는 동일한 디렉토리에 있어야 불러올 수 있음
다른 디렉토리에서도 불러올 수 있는 방법 2가지
#1. sys 모듈을 통해 다른 모듈이 있는 경로를 추가해준다.
import sys
sys.path.append("모듈이있는 경로")
#ex)
#sys.path.append("C:/Users/spidyweb/Anaconda3/Lib/site-packages")
#2. PYTHONPATH 등록(terminal과 같은 곳에)
set PYTHONPATH=C:/Users/spidyweb/Anaconda3/Lib/site-packages
2) if __name__=="__main__":
- 메인함수를 찾는 구문
- 명령 프롬프트(터미널)과 같은 곳에서 python 파일을 직접 실행 하게 될 경우
if __name__=="__main__":가 참이 되어 if문 다음 문장이 수행됨 - 반대로 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 거짓이 되어 수행되지 않음
- 터미널과 같은 곳에서 직접 실행 할 경우 실행할 코드를 해당 if __name__=="__main__": 에 입력
3) __name__ 변수란?
- 파이썬의 __name__ 변수는 파이썬이 내부적으로 사용하는 특별한 변수 이름
- 만약 C:\doit>python mod1.py처럼 직접 mod1.py 파일을 실행할 경우 mod1.py의 __name__ 변수에는 __main__ 값이 저장
- 파이썬 셸이나 다른 파이썬 모듈에서 mod1을 import 할 경우에는 mod1.py의 __name__ 변수에는 mod1.py의 모듈 이름 값 mod1이 저장
2. Package란
- 패키지는 다른말로 디렉토리
- 패키지는 모듈을 모아 놓은 디렉토리
1) 패키지 인식 시키는 법
- 일반 디렉토리와 구별을 위해서 __init__.py을 통해 구별
- __init__.py파일이 디렉토리에 위치하면 파이썬은 해당 디렉토리를 패키지로 인식
- __init__.py에는 아무 내용도 없음
- python3.3버전 이상부터는 __init__.py파일이 없어도 패키지로 인식되지만, 하위버전과의 호환성을 위해 __init__.py파일이 있는 것이 좋음
2) package를 쓸 때의 이점
- 간단한 파이썬 프로그램이 아니라면 이렇게 패키지 구조로 파이썬 프로그램을 만드는 것이 공동 작업이나 유지 보수 등 여러 면에서 유리
- 패키지 구조로 모듈을 만들면 다른 모듈과 이름이 겹치더라도 더 안전하게 사용
3) 패키지를 불러오는 방법
모듈과 마찬가지로 패키지도 불러올 때 여러가지 방법이 존재
#1. 모듈 단위 import
import game.sound.echo
#import 패키지.패키지.파이썬파일
#2. 모듈이 있는 디렉토리까지 from import
from game.sound import echo
#from 패키지.패키지 import 파이썬파일
#3. 사용하는 함수 직접 불어오기
from game.sound.echo import 함수
#from 패키지.패키지.파이썬파일 import 함수
#4. 특정 모듈의 사용하는 함수 전체 불러오기
from game.sound.echo import *
#from 패키지.패키지.파이썬파일 import 함수 전체
위의 4번과 달리 아래의 패키지.패키지 그리고 특정 모듈을 지정하지 않은채로 어느 한 모듈의 함수를 쓰고싶을 때에는
from 패키지.패키지 import 함수
다음과 같이 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 함
# C:/doit/game/sound/__init__.py
__all__ = ['echo']
여기에서 __all__이 의미하는 것은 sound 디렉터리에서 * 기호를 사용하여 import할 경우 이곳에 정의된 echo 모듈만 import된다는 의미
※ 착각하기 쉬운데 from game.sound.echo import * 는 __all__과 상관없이 무조건 import됨
이렇게 __all__과 상관없이 무조건 import되는 경우는 from a.b.c import * 에서 from의 마지막 항목인 c가 모듈인 경우
2022-04-09 예시코드 수정
참조:
728x90