language/Python

[Python] module, 사용법, if __name__=="__main__": ,package 개념

스파이디웹 2022. 2. 18. 11:40
728x90

1. 모듈(module)이란?

  • 함수나 변수 또는 클래스를 모아 놓은 파일
  • 다른 파이썬 프로그램에서 불러와 사용할 수 있게끔 만든 파이썬 파일
  • 코드의 특정 부분을 분리해서 따로 모아놓은 것
  • 파일 하나를 1개의 모듈로 봄
  • import 문을 통해 모듈 사용이 가능
  • 가독성을 위해서 맨위에 import문을 넣음

1) 모듈 불러오기

결국 모듈은 파이썬 파일이고 이 모듈을 불러오는 것이 중요

  1. import 모듈(파이썬 파일명)
  2. import는 현재 디렉터리에 있는 파일이나 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈만 불러올 수 있다.(현재 디렉터리의 파이썬 파일, 가상환경 내 site-packages에 있는 파이썬 파일)
  3. def add(a, b):
        return a + b
  4. 해당 코드가 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출력
  5. 다른 파일에서 모듈 불러오기

다른 파일에서 모듈을 불러올 때에는 동일한 디렉토리에 있어야 불러올 수 있음

 

다른 디렉토리에서도 불러올 수 있는 방법 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 예시코드 수정

 

참조:

https://wikidocs.net/29

https://doitnow-man.tistory.com/146

728x90