본문 바로가기
Programming/Python

20. 모듈 만들기

by IT learning 2021. 3. 25.
728x90

지금 까지 표준 모듈, 외부 모듈들을 사용하는 방법에 대해 알아보았다.

그렇다면 이 모듈들은 어떻게 만들어지는지에 대해 알아보자.

 

파이썬은 모듈을 만드는 방법이 간단하다.

단순하게 파이썬 파일을 만들고, 이를 외부에서 읽어 들이면 모듈이 된다.

 

이 글에서는 원의 반지름과 넓이를 구하는 간단한 모듈을 만들어 보면서

모듈을 만드는 방법, 모듈 실행과 관련된 안전 장치를 설치하는 방법, 패키지를 만드는 방법 에 대해 알아보겠다.

 

모듈 만들기

먼저 아래 사진 처럼 module_basic 폴더와 main.py , test_module.py 두 파일을 생성해주길 바란다.

생성해주세요!

그냥 모듈 내부에 변수와 함수 등을 잔뜩 넣어주면 되는데, 간단하게 만들어보겠다.

# test_module.py 파일
PI = 3.141592

def number_input():
    output = input("숫자 입력> ")
    return float(output)

def get_circumference(radius):
    return 2 * PI * radius

def get_circle_area(radius):
    return PI * radius * radius

위 코드는 test_module.py 의 작성 코드이다.

이렇게 변수와 원하는 함수들을 작성해준다.

# main.py 파일

import test_module as test

radius = test.number_input()
print(test.get_circumference(radius))
print(test.get_circle_area(radius))

그 후 main.py 파일에 이렇게 작성해준다.

main 파일의 코드는 그냥 우리가 모듈을 사용했던 방법처럼 사용하면 된다.

위 코드의 실행결과이다.

따라서 모듈에서 불러와 해당 함수들을 main에서 실행한 결과이다.

 

__name__ == "__main__"

다른 사람들이 만든 파이썬 코드들을 보면 __name__ == "__main__" 이라는 코드를 볼수가 있다.

이 의미가 무엇인지 확인해보겠다.

 

프로그래밍 언어에서는 프로그램의 진입점엔트리 포인트(Entry point) 또는 메인(main) 이라고 부른다.

그리고 이러한 엔트리 포인트 또는 메인 내부에서의 __name__ 은 "__main__" 이다.

 

모듈의 __name__

위와 같이 생성해준다.

# test_module.py 파일
print("# 모듈의 __name__ 출력하기")
print(__name__)
print()
# main.py 파일
import test_module

print("# 메인의 __name__ 출력하기")
print(__name__)

위 코드를 살펴보자.

엔트리 포인트가 아니지만 엔트리 포인트 파일 내에서 import 되었기 때문에 코드가 실행된다.

위 코드의 실행결과이다.

코드를 실행하면 엔트리 포인트 파일에서는 "__main__"을 출력하지만, 모듈 파일에서는 모듈 이름을 출력하는 것을 볼 수 있다.

 

__name__ 활용하기

엔트리 포인트 파일 내부에서는 __name__ 이 "__main__" 이라는 값을 가진다.

이를 활용하면 파일이 모듈로 실행되는지, 엔트리 포인트로 실행되는지확인할 수 있다.

위와 같이 생성해준다.

# test_module.py 파일
PI = 3.141592

def number_input():
    output = input("숫자 입력> ")
    return float(output)

def get_circumference(radius):
    return 2 * PI * radius

def get_circle_area(radius):
    return PI * radius * radius

# 활용 예
print("get_circumference(10):", get_circumference(10))
print("get_circle_area(10):", get_circle_area(10))
# main.py 파일
import test_module as test

radius = test.number_input()
print(test.get_circumference(radius))
print(test.get_circle_area(radius))

해당 파일들의 코드이다.

위 코드의 실행결과이다.

현재 test_module.py 파일에는 '이런식으로 동작한다'라는 설명을 위해 추가한 내용 예시 부분들이 있다.

모듈로 사용하고 있는데, 내부에서 출력이 발생하니 문제가 된다.

이때, 현재 파일이 엔트리 포인트인지 구분하는 코드를 활용한다.

이때 사용하는 게 조건문으로 __name__ 이 "__main__" 인지 확인하는 방법이다.

# test_module.py 파일
PI = 3.141592

def number_input():
    output = input("숫자 입력> ")
    return float(output)

def get_circumference(radius):
    return 2 * PI * radius

def get_circle_area(radius):
    return PI * radius * radius

# 활용 예
if __name__ == "__main__": # 현재 파일이 엔트리 포인트인지 확인하고, 엔트리 포인트일 떄만 실행한다.
    print("get_circumference(10):", get_circumference(10))
    print("get_circle_area(10):", get_circle_area(10))

위에 있는 test_module.py 파일의 활용 예시 부분에 조건문을 넣어줌 으로써, 엔트리 포인트 일때만 실행하게 된다.

위 코드의 실행결과이다.

따라서 main.py 파일을 실행하면 아까 활용 예시로 출력된 것들이 뜨지 않고 정상 출력이 되는 모습을 볼 수 있다.

 

 

패키지

우리가 전 시간에 사용했던 pip 는 Python Package Index의 줄임말로 패키지 관리 시스템이다.

그럼 패키지와 모듈은 무엇이 다를까? 결론부터 말하자면 모듈이 모여서 구조를 이루면 패키지라고 부른다.

 

패키지 만들기

 

일단 폴더 구성을 이렇게 해준다.

그리고 test_package 폴더에

위와 같이 생성해준다.

# module_a.py 파일
variable_a = "a 모듈의 변수"
# module_b.py 파일
variable_b = "b 모듈의 변수"
# main.py 파일
import test_package.module_a as a
import test_package.module_b as b

print(a.variable_a)
print(b.variable_b)

이렇게 작성해주고 출력하면

위 코드의 실행결과이다.

이렇게 실행된다.

 

__init__.py 파일

패키지를 읽을 때 어떤 처리를 수행해야 하거나 패키지 내부의 모듈들을 한꺼번에 가져오고 싶을 때 사용한다.

test_package 폴더 내부에 다음과 같이 파일을 생성한다.

저 파일 하나 생성

# "from test_package import *"로
# 모듈을 읽어 들일 때 가져올 모듈
__all__ = ["module_a", "module_b"] # 사용시 읽어들일 모듈의 목록

print("test_package를 읽어 들였습니다.")

그리고 이렇게 작성한다.

main.py 파일도 수정한다.

# main.py 파일
from test_package import *

print(module_a.variable_a)
print(module_b.variable_b)

그리고 실행해보면

위 코드의 실행결과이다.

다음과 같이 패키지를 읽어들인 문구와 함께 변수들을 출력한다.

 

이렇게 모듈을 만들고 실행해보는 것 까지 진행해보았다.

 

정리
엔트리 포인트
는 python 명령어를 사용해서 첫 진입 파일을 엔트리 포인트라고 부른다.
__name__ == "__main__"는 현재 파일이 엔트리 포인트인지 확인할 때 사용하는 코드이다.
패키지는 모듈이 모인 것을 말한다.
728x90

'Programming > Python' 카테고리의 다른 글

22. 클래스의 추가적인 구문  (0) 2021.03.27
21. 클래스  (0) 2021.03.26
19. 외부 모듈(Beautiful Soup, Flask 모듈)  (0) 2021.03.24
18. 표준 모듈  (0) 2021.03.23
17. 예외 고급  (0) 2021.03.22

댓글

IT_learning's Commit