[파이썬] 모듈, 패키지, import

InAnarchy·2023년 4월 17일
0

Python

목록 보기
12/14
post-thumbnail

모듈

  • 변수, 함수, 클래스 등을 모아 놓은 스크립트 파일
  • 하나의 .py 파일은 모듈

모듈 만들기

2의 거듭제곱을 만드는 모듈을 만들었다.
파일명은 square2.py이다.
이 때 확장자 .py를 제외한 square2가 모듈 이름이다.

base = 2

def square(n):    
    return base ** n

모듈 사용하기

모듈을 사용하는 데 두가지 방법이 있다.

import

변수, 함수

import 모듈
import 모듈 as 이름
  1. square2.py가 있는 같은 경로에 test.py라는 파일을 만들었다.
    코드는 다음과 같다.
import square2               # import로 square2 모듈을 가져옴
 
print(square2.base)          # 모듈.변수 형식으로 모듈의 변수 사용
print(square2.square(10))    # 모듈.함수() 형식으로 모듈의 함수 사용

import로 모듈을 가져온 뒤 모듈.변수, 모듈.함수() 형식으로 사용한다.

  1. 다음은 파이썬에서 기본적으로 제공하는 math모듈을 예시로 들어보자.
import math
print(math.pi) #3.141592653589793
print(math.sqrt(5)) #2.23606797749979

각각 모듈.변수, 모듈.함수() 형식으로 사용했다.

  1. 모듈 이름을 계속 타이핑하기 귀찮을 때, 모듈의 이름을 지정해 간략화할 수 있다.
import math as m
print(m.pi) #3.141592653589793
print(m.sqrt(5)) #2.23606797749979
print(m.ceil(3.12)) #4

클래스

모듈에 함수 뿐 아니라 클래스를 작성하고 불러올 수도 있다.

class Person:    
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def greeting(self):
        print('{0}, {1}'.format(self.name,self.age))
import person   
 
JK = person.Person('JK', 26)
JK.greeting() #JK,26

from import

변수, 함수

from 모듈 import 변수,함수
from 모듈 import 변수/함수/클래스 as 이름

모듈에서 from import로 변수와 함수를 가져온 뒤 모듈 이름을 붙이지 않고 사용하는 방식이다.

  1. 위의 square2 모듈에서 base변수, square 함수를 가져왔다.
from square2 import base, square         
 
print(base)          
print(square(10))
  1. math모듈에서 pi변수만 가져왔다.
from math import pi
print(pi) #3.141592653589793
#print(math.ceil(3.12)) #NameError: name 'math' is not defined
#print(ceil(3.12)) #NameError: name 'ceil' is not defined
  1. math모듈의 모든 변수와 함수를 가져왔다.
from math import *
print(pi) #3.141592653589793
print(ceil(3.12)) #4
# print(math.ceil(3.12)) #NameError: name 'math' is not defined
  1. from import도 모듈의 이름을 지정할 수 있다.
from math import ceil as ce, sqrt as sq

print(ce(4.3)) #5
print(sq(4)) #2.0
#print(PI) #NameError: name 'PI' is not defined
#print(math.PI) #NameError: name 'math' is not defined

클래스

from import에서도 마찬가지로 클래스를 불러올 수 있다.

class Person:    
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def greeting(self):
        print('{0}, {1}'.format(self.name,self.age))
from person import Person
 
JK = Person('JK', 26)
JK.greeting()

패키지(라이브러리)

  • 여러 모듈을 묶은 것
  • 보통 관련된 기능을 함께 그룹화할 때 사용
  • 도트(.)를 사용하여 파이썬 모듈을 디렉터리 구조로 관리
  • 디렉터리 내에 __init__.py 파일이 있어야 함
packtest/
    main.py
    math_tools/
        __init__.py
        calculator.py
        geometry/
            __init__.py
            shapes.py

위와 같은 구조로 디렉터리와 모듈을 만들어보자.

math_tools에 calculator 모듈을 만들었고
geometry라는 서브 디렉터리를 추가하여 shapes 모듈을 만들었다.

#calculator.py
def add(a, b):
    return a + b

def subtract(a, b):
    return a - b

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

def divide(a, b):
    return a / b
#shapes.py
import math

def rectangle_area(width, height):
    return width * height

def circle_area(radius):
    return math.pi * radius ** 2
# __init__.py
빈 파일
#main.py
from math_tools import calculator
from math_tools.geometry import shapes

result = calculator.add(2, 3)
print("2 + 3 =", result)

rect_area = shapes.rectangle_area(5, 6)
print("Rectangle area (5, 6) =", rect_area)

circle_area = shapes.circle_area(3)
print("Circle area (radius=3) =", circle_area)

이 때 메인함수에서

from math_tools import calculator

는 math_tools 디렉터리의 calculator 모듈을 가져오고

from math_tools.geometry import shapes

는 math_tools디렉터리의 geometry 서브 디렉터리에 있는 shapes 모듈을 가져온다는 뜻이다.

여담으로..

메인함수에서

from math_tools.geometry import shapes

이 아닌

import math_tools.geometry.shapes

으로 사용할 수도 있으나, 모듈을 사용할 떄 전체 경로를 지정해야하므로 몹시 귀찮아진다.

from math_tools import calculator
import math_tools.geometry.shapes

result = calculator.add(2, 3)
print("2 + 3 =", result)

rect_area = math_tools.geometry.shapes.rectangle_area(5, 6)
print("Rectangle area (5, 6) =", rect_area)

circle_area = math_tools.geometry.shapes.circle_area(3)
print("Circle area (radius=3) =", circle_area)

REFERENCE
코딩도장
wikidocs

profile
github blog 쓰다가 관리하기 귀찮아서 돌아왔다

0개의 댓글