Skip to content

32. 모듈(Module)과 패키지(Package)


1. 키워드

  • 모듈(Module)
  • 패키지(Package)
  • 네임스페이스(Namespace)
  • 파이썬 표준 라이브러리(PSL: Python Standard Library)
  • 파이썬 패키지 인덱스(PyPI: Python Package Index)


2. 모듈과 패키지 사용하기

  • 모듈은 각종 변수, 함수, 클래스를 담고 있는 파일이고, 패키지는 여러 모듈을 묶은 것이다.


모듈, 패키지, 라이브러리

  • 모듈은 특정 기능을 .py 파일 단위로 작성한 것이다.
  • 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것으로, 모듈에 네임스페이스를 제공한다.
  • 파이썬 표준 라이브러리는 파이썬에 기본으로 설치된 모듈과 패키지, 내장 함수를 묶은 것이다.


3. import로 모듈 가져오기

  • 모듈은 import 키워드로 가져올 수 있다.


import 모듈
import 모듈1, 모듈2


  • 그럼 간단하게 파이썬 표준 라이브러리의 수학 모듈 math를 가져와서 원주율을 출력해 보자.


>>> import math

>>> math.pi
3.141592653589793


  • import에 모듈 이름을 지정하면 해당 모듈을 가져올 수 있으며, path.pi와 같이 모듈.변수 형식으로 모듈의 변수를 사용한다.


  • 이번에는 math 모듈의 제곱근 함수 sqrt를 사용해 보자.


>>> import math

>>> math.sqrt(4.0)
2.0
>>> math.sqrt(2.0)
1.4142135623730951


  • 모듈의 함수는 math.sqrt(4.0)과 같이 모듈.함수() 형식으로 사용한다.


1) import as로 모듈 이름 지정하기

  • 모듈의 함수를 사용할 때 math.sqrt처럼 일일이 math를 입력하기 귀찮은 경우가 생기는데, 이때는 import as를 사용하여 모듈의 이름을 지정할 수 있다.


import 모듈 as 이름


  • 이제 math 모듈을 m으로 줄여보자.


>>> import math as m

>>> m.sqrt(4.0)
2.0
>>> m.sqrt(2.0)
1.4142135623730951


  • import math as m과 같이 모듈을 가져오면서 as 뒤에 이름을 지정해 준다.
  • 이후 math 모듈을 사용할 때 m으로 줄여서 사용할 수 있다.


2) from import로 모듈의 일부만 가져오기

  • import as로 모듈의 이름을 지정하는 방법보다 더 편한 방법이 있는데, from import로 원하는 변수만 가져올 수 있다.


from 모듈 import 변수


  • 다음은 math 모듈에서 변수 pi만 가져온다.


>>> from math import pi

>>> pi
3.141592653589793


  • from math import pi와 같이 from 뒤에 모듈 이름을 지정하고 import 뒤에 가져올 변수를 입력한다.
  • 이후 가져온 변수를 사용할 때는 pi와 같이 모듈 이름을 붙이지 않고 바로 사용하면 된다.


  • 모듈의 변수를 가져왔으니 이번에는 함수(클래스)를 가져와보자.


from 모듈 import 함수
from 모듈 import 클래스


  • 다음은 math 모듈에서 sqrt 함수만 가져온다.


>>> from math import sqrt

>>> sqrt(4.0)
2.0
>>> sqrt(2.0)
1.4142135623730951


  • math 모듈에서 sqrt 함수만 가져왔으므로 sqrt(4.0)처럼 앞에 math를 붙이지 않고 함수를 바로 사용할 수 있다.


  • 지금까지 변수나 함수를 하나만 가져왔지만 math 모듈에서 가져올 변수와 함수가 여러 개일 수도 있다.
  • 이때는 import 뒤에 가져올 변수, 함수, 클래스를 ,(콤마)로 구분하여 여러 개를 지정해 주면 된다.


from 모듈 import 변수, 함수, 클래스


  • 다음은 math 모듈에서 pi, sqrt를 가져온다.


>>> from math import pi, sqrt

>>> pi
3.141592653589793
>>> sqrt(4.0)
2.0
>>> sqrt(2.0)
1.4142135623730951


  • from math import pi, sqrt와 같이 pisqrt 두 개를 가져왔지만 변수, 함수, 클래스가 두세 개가 아니라 수십 개가 된다면 입력하기 번거로울 것이다.
  • from import는 모듈의 모든 변수, 함수, 클래스를 가져오는 기능도 있다.


from 모듈 import *


  • 다음은 math 모듈의 모든 변수, 함수, 클래스를 가져온다.


>>> from math import *

>>> pi
3.141592653589793
>>> sqrt(4.0)
2.0
>>> sqrt(2.0)
1.4142135623730951


  • from math import *와 같이 지정하면 math 모듈의 모든 함수, 변수, 클래스를 가져온다.


3) from import로 모듈의 일부를 가져온 뒤 이름 지정하기

  • 이번에는 from import로 변수, 함수, 클래스를 가져온 뒤 이름을 지정해 보자.


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


  • 다음은 math 모듈에서 sqrt 함수를 가져오면서 이름을 s로 지정한다.


>>> from math import sqrt as s

>>> s(4.0)
2.0
>>> s(2.0)
1.4142135623730951


  • from import로 가져온 변수, 함수, 클래스 뒤에 as로 이름을 지정해 주면 된다.


  • 만약 여러 개를 가져왔을 때는 각 변수, 함수, 클래스 등을 ,(콤마)로 구분하여 as를 여러 개 지정하면 된다.


from 모듈 import 변수 as 이름1, 함수 as 이름2, 클래스 as 이름3


  • 다음은 math 모듈의 pi를 가져오면서 이름을 p로, sqrt를 가져오면서 이름을 s로 지정한다.


>>> from math import pi as p, sqrt as s

>>> p
3.141592653589793
>>> s(4.0)
2.0
>>> s(2.0)
1.4142135623730951


  • 이처럼 as를 사용하면 모듈의 이름을 원하는 대로 지정해서 사용할 수 있다.


가져온 모듈 해제하기, 다시 가져오기

  • import로 가져온 모듈(변수, 함수, 클래스)은 del로 해제할 수 있다.


>>> import math

>>> del math


  • 모듈을 다시 가져오려면 importlib.reload를 사용한다.


>>> import importlib
>>> import math

>>> importlib.reload(math)


4. import로 패키지 가져오기

  • 패키지는 특정 기능과 관련된 여러 모듈을 묶은 것인데, 패키지에 들어있는 모듈도 import를 사용하여 가져온다.


import 패키지.모듈
import 패키지.모듈1, 패키지.모듈2


  • 파이썬 표준 라이브러리에서 urillib 패키지의 request 모듈을 가져와보자.


>>> import urllib.request

>>> response = urllib.request.urlopen("http://www.google.co.kr")
>>> response.status
200


  • 패키지에 들어있는 모듈은 import urllib.request와 같이 패키지.모듈 형식으로 가져온다.
  • 마찬가지로 모듈의 함수를 사용할 때도 urllib.request.urlopen()과 같이 패키지.모듈.함수() 형식으로 패키지 이름과 모듈 이름을 모두 입력해 준다.


urlopen 함수

  • urllib.request.urlopen은 URL을 여는 함수인데 URL 열기에 성공하면 response.status의 값이 200이 나온다.
  • 200은 HTTP 상태 코드이며 웹 서버가 요청을 제대로 처리했다는 뜻이다.


1) import as로 패키지 모듈 이름 지정하기

  • 패키지 안에 들어있는 모듈도 import as를 사용하여 이름을 지정할 수 있다.


import 패키지.모듈 as 이름


  • 다음은 urllib 패키지의 request 모듈을 가져오면서 이름을 r로 지정한다.


>>> import urllib.request as r

>>> response = r.urlopen("http://www.google.co.kr")
>>> response.status
200


2) from import로 패키지의 모듈에서 일부만 가져오기

  • 패키지도 from import를 사용하여 모듈에서 변수, 함수, 클래스를 가져올 수 있다.


from 패키지.모듈 import 변수
from 패키지.모듈 import 함수
from 패키지.모듈 import 클래스
from 패키지.모듈 import 변수, 함수, 클래스


  • urllib 패키지의 request 모듈에서 urlopen 함수와 Request 클래스를 가져와보자.


>>> from urllib.request import Request, urlopen

>>> req = Request("http://www.google.co.kr")
>>> response = urlopen(req)
>>> response.status
200


  • 참고로 urlopen 함수에 URL을 바로 넣어도 되고, Request("http://www.google.co.kr")와 같이 Request 클래스에 URL을 넣은 뒤에 req를 생성해서 urlopen 함수에 넣어도 된다.


  • 패키지의 모듈에서 모든 변수, 함수, 클래스를 가져오는 방법은 다음과 같다.


from 패키지.모듈 import *


  • 다음은 urllibrequest 모듈에서 모든 변수, 함수, 클래스를 가져온다.


>>> from urllib.request import *

>>> req = Request("http://www.google.co.kr")
>>> response = urlopen(req)
>>> response.status
200


3) from import로 패키지의 모듈의 일부를 가져온 뒤 이름 지정하기

  • 이번에는 from import로 패키지의 모듈에서 변수, 함수, 클래스를 가져온 뒤 이름을 지정해 보자.


from 패키지.모듈 import 변수 as 이름
from 패키지.모듈 import 변수 as 이름, 함수 as 이름, 클래스 as 이름


  • 다음은 urllib 패키지의 request 모듈에서 Request 클래스를 가져온 뒤 이름을 r로 지정하고, urlopen 함수를 가져온 뒤 이름을 u로 지정한다.


>>> from urllib.request import Request as r, urlopen as u

>>> req = r("http://www.google.co.kr")
>>> response = u(req)
>>> response.status
200


5. 모듈 만들기

  • 파이썬 스크립트를 작성할 때마다 매번 비슷한 클래스와 함수를 작성한다면 코드도 길어지고 중복되는 부분이 생긴다.
  • 이런 경우 공통되는 부분을 빼내서 모듈과 패키지로 만들면 되고, 이후 코드를 다시 만들지 않고 모듈과 패키지만 가져와서 사용하면 편리하다.


  • 간단하게 2의 거듭제곱을 구하는 모듈을 만들어보자.
  • 다음 내용을 프로젝트 폴더 안에 square2.py 파일로 저장한다.


base = 2

def square(n):
    return base ** n


  • 이렇게 변수와 함수를 넣어서 square2.py 파일을 만들었다.
  • 이렇게 모듈을 만들었을 때 모듈 이름은 square2가 된다.
  • 즉, 스크립트 파일에서 확장자 .py를 제외하면 모듈 이름이 된다.


1) 모듈 사용하기

  • 이제 square2 모듈을 사용해 보자.
  • 다음 내용을 프로젝트 폴더 안에 main.py 파일로 저장한 뒤 실행해 보자.
  • 이때 square2.py 파일과 main.py 파일은 반드시 같은 폴더에 있어야 한다.


import square2

print(square2.base) # 2
print(square2.square(10)) # 1024


  • 실행을 해보면 square2 모듈에 만들었던 변수 base의 값이 출력되고, square 함수도 호출된다.
  • 이처럼 모듈을 사용할 때는 import로 모듈을 가져온 뒤 모듈.변수, 모듈.함수() 형식으로 사용한다.


2) from import로 변수, 함수 가져오기

  • 모듈에서 from import로 변수와 함수를 가져온 뒤 모듈 이름을 붙이지 않고 사용할 수도 있다.


>>> from square2 import base, square

>>> print(base)
2
>>> square(10)
1024


3) 모듈에 클래스 작성하기

  • 이번에는 모듈에 클래스를 작성하고 사용해 보자.
  • 다음 내용을 프로젝트 폴더 안에 person.py 파일로 저장해 보자.


class Person:
    def __init__(self, name, age, address):
        self.name = name
        self.age = age
        self.address = address

    def greeting(self):
        print(f"안녕하세요. 저는 {self.name}입니다.")


  • 이제 main.py 파일을 다음과 같이 실행해 보자.


import person

maria = person.Person("마리아", 20, "서울시 서초구 반포동")
maria.greeting() # 안녕하세요. 저는 마리아입니다.


  • 모듈의 클래스를 사용하는 방법도 변수, 함수와 같다.
  • 즉, 모듈.클래스() 형식으로 모듈의 클래스를 사용하며, 클래스로 인스턴스를 만들 때는 person.Person("마리아", 20, "서울시 서초구 반포동")과 같이 사용하면 된다.


4) from import로 클래스 가져오기

  • 물론 모듈에서 from import로 클래스를 가져온 뒤 모듈 이름을 붙이지 않고 사용할 수도 있다.


>>> from person import Person

>>> maria = Person("마리아", 20, "서울시 서초구 반포동")
>>> maria.greeting()
안녕하세요. 저는 마리아입니다.


  • 지금까지 만든 square2, person 모듈을 그림으로 나타내면 다음과 같은 모양이 된다.


001


6. 모듈과 시작점 알아보기

  • 파이썬 코드를 보다 보면 if __name__ == "__main__":으로 시작하는 부분을 자주 만나게 된다.


if __name__ == "__main__":
    코드


  • 이 코드는 현재 스크립트 파일이 실행되는 상태를 파악하기 위해 사용한다.


  • 먼저 __name__부터 알아보자.
  • 다음 내용을 프로젝트 폴더 안에 hello.py 파일로 저장해 보자.


print("hello 모듈 시작")
print(f"hello.py __name__: {__name__}")
print("hello 모듈 끝")


  • 그리고 다음 내용을 프로젝트 폴더 안에 main.py 파일로 저장한 뒤 실행해 보자.


import hello

print(f"main.py __name__: {__name__}")

# hello 모듈 시작
# hello.py __name__: hello
# hello 모듈 끝
# main.py __name__: __main__


  • 실행을 해보면 hello.py 파일과 main.py 파일의 __name__ 변수 값이 출력된다.
  • 파이썬에서 import로 모듈을 가져오면 해당 스크립트 파일이 한 번 실행된다.
  • 따라서 hello 모듈을 가져오면 hello.py 안의 코드가 살행된다.
  • 따라서 hello.py__name__ 변수에는 'hello'가 들어가고, main.py__name__ 변수에는 '__main__'이 들어간다.


002


  • 즉, __name__은 모듈의 이름이 저장되는 변수이며 import로 모듈을 가져왔을 때 모듈의 이름이 들어간다.
  • 하지만 파이썬 인터프리터로 스크립트 파일을 직접 실행했을 때는 모듈의 이름이 아니라 '__main__'이 들어간다.


  • 좀 더 정확하게 알아보기 위해 콘솔에서 python으로 main.py 파일을 실행해 보자.


python main.py
hello 모듈 시작
hello.py __name__: hello
hello 모듈 끝
main.py __name__: __main__


  • python main.py와 같이 파이썬으로 스크립트 파일을 직접 실행했다.
  • 여기서도 hello.py 파일의 __name__ 변수에는 'hello' 그리고 main.py 파일의 __name__ 변수에는 '__main__'이 들어간다.


003


  • 하지만 다음과 같이 python으로 hello.py 파일을 실행해 보면 결과가 조금 달라진다.


python hello.py
hello 모듈 시작
hello.py __name__: __main__
hello 모듈 끝


  • hello.py 파일의 __name__ 변수에는 'hello'가 아니라 '__main__'이 들어간다.
  • 즉, 어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 __name__에는 '__main__'이 들어간다.
  • 이는 프로그램의 시작점(Entry Point)이라는 뜻이다.


004


  • 파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없다.
  • 어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있다.
  • 그래서 __name__ 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단한다.
  • if __name__ == "__main__":처럼 __name__ 변수의 값이 '__main__'인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업이다.
  • 즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도이다.


1) 스크립트 파일로 실행하거나 모듈로 사용하는 코드 만들기

  • 그럼 스크립트 파일을 그대로 실행할 수도 있고, 모듈로도 사용할 수 있는 코드를 만들어보자.
  • 다음 내용을 프로젝트 폴더 안에 calc.py 파일로 저장한 뒤 실행해 보자.


def add(a, b):
    return a + b

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

if __name__ == "__main__":
    print(add(10, 20))
    print(mul(10, 20))

# 30
# 200
python calc.py
30
200


  • IDLE에서 실행하거나 python calc.py와 같이 파이썬 인터프리터로 실행하면 10, 20의 합과 곱이 출력된다.
  • 즉, 프로그램의 시작점일 때는 if __name__ == "__main__": 아래의 코드가 실행된다.


  • 그럼 calc.py를 모듈로 사용해보기 위해 다음과 같이 importcalc를 가져와보자.


>>> import calc
>>>


  • 모듈로 가져왔을 때는 아무것도 출력되지 않는다.
  • 왜냐하면 __name__ 변수의 값이 '__main__'일 때만 10, 20의 합과 곱을 출력하도록 만들었기 때문이다.
  • 즉, 스크립트 파일을 모듈로 사용할 때는 calc.add, calc.mul처럼 함수만 사용하는 것이 목적이므로 10, 20의 합과 곱을 출력하는 코드는 필요가 없다.


  • 이때는 다음과 같이 calc.addcalc.mul 함수에 원하는 값을 넣어서 사용하면 된다.


>>> calc.add(50, 60)
110
>>> calc.mul(50, 60)
3000


파이썬은 왜 프로그램의 시작점이 정해져 있지 않나요?

  • 파이썬이 처음에 개발될 당시에는 리눅스/유닉스에서 사용하는 스크립트 언어 기반이었기 때문에 프로그램의 시작점이 따로 정해져 있지 않았다.
  • 보통 리눅스/유닉스의 스크립트 파일은 파일 한 개로 이루어진 경우가 많은데, 이 스크립트 파일 자체가 하나의 프로그램이다 보니 시작점이 따로 필요하지 않다.
  • 하지만 C나 자바같은 언어는 처음 만들어질 때부터 소스 파일을 여러 개 사용했기 때문에 여러 소스 파일의 함수들 중에서도 시작 함수(main)를 따로 정해 놓았다.


7. 패키지 만들기

  • 이번에는 패키지를 만들어보자.
  • 모듈은 스크립트 파일이 한 개지만 패키지는 폴더(디렉터리)로 구성되어 있다.


  • 지금부터 만들 패키지의 폴더 구성은 다음과 같다.


005


  • 먼저 프로젝트 폴더 안에 calcpkg 폴더를 만든다.
  • 그리고 다음 내용을 calcpkg 폴더 안에 __init__.py 파일로 저장한다.


# __init__.py 파일은 내용을 비워둘 수 있음


  • 폴더 안에 __init__.py 파일이 있으면 해당 폴더는 패키지로 인식된다.
  • 그리고 기본적으로 __init__.py 파일의 내용은 비워둘 수 있다.


1) 패키지에 모듈 만들기

  • 이제 calcpkg 패키지에 모듈을 두 개를 만들자.
  • 첫 번째 모듈은 덧셈, 곱셈 함수가 들어있는 operation 모듈이고, 두 번째 모듈은 삼각형, 사각형의 넓이 계산 함수가 들어있는 geometry 모듈이다.


  • 먼저 다음 내용을 calcpkg 폴더 안에 operation.py 파일로 저장한다.


def add(a, b):
    return a + b

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


  • 그리고 다음 내용을 calcpkg 폴더 안에 geometry.py 파일로 저장한다.


def triangle_area(base, height):
    return base * height / 2

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


2) 패키지 사용하기

  • 이제 스크립트 파일에서 패키지의 모듈을 사용해 보자.
  • 다음 내용을 프로젝트 폴더 안에 main.py 파일로 저장한 뒤 실행해 보자.


import calcpkg.operation
import calcpkg.geometry

print(calcpkg.operation.add(10, 20)) # 30
print(calcpkg.operation.mul(10, 20)) # 200

print(calcpkg.geometry.triangle_area(30, 40)) # 600.0
print(calcpkg.geometry.rectangle_area(30, 40)) # 1200


  • calcpkg 패키지의 operation 모듈과 geometry 모듈을 가져와서 안에 들어있는 함수를 호출했다.
  • 이처럼 패키지의 모듈을 가져올 때는 import 패키지.모듈 형식으로 가져온다.
  • 그리고 패키지.모듈.함수() 형식으로 모듈의 함수를 사용한다.


3) from import로 패키지의 모듈에서 변수, 함수, 클래스 가져오기

  • 물론 패키지의 모듈에서 from import로 함수(변수, 클래스)를 가져온 뒤 패키지와 모듈 이름을 붙이지 않고 사용할 수도 있다.


>>> from calcpkg.operation import add, mul

>>> add(10, 20)
30
>>> mul(10, 20)
200


  • 지금까지 만든 main.py 스크립트 파일과 calcpkg 패키지의 계층을 그림으로 나타내면 다음과 같은 모양이 된다.

006


패키지의 모듈과 __name__

  • 패키지의 모듈에서는 __name__ 변수에 패키지.모듈 형식으로 이름이 들어간다.
  • 즉, calcpkg 패키지의 geometry.py에서 __name__의 값이 출력하도록 만들고, import로 가져오면 'calcpkg.geometry'가 나온다.


모듈과 패키지를 찾는 경로

  • 지금까지 모듈과 패키지는 현재 폴더(디렉터리)에 만들었다.
  • 파이썬에서는 현재 폴더에 모듈, 패키지가 없으면 다음 경로에서 모듈, 패키지를 찾는다.


>>> import sys

>>> sys.path
['C:\\project',
'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\Lib\\idlelib',  'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\python36.zip',  'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32', 'C:\\Users\\dojang\\AppData\\Local\\Programs\\Python\\Python36-32\\lib\\site-packages']


  • sys 모듈의 path 변수에는 모듈, 패키지를 찾는 경로가 들어있다.
  • 여기서 site-packages 폴더에는 pip로 설치한 패키지가 들어있다.
  • 그리고 자기가 만든 모듈, 패키지도 site-packages 폴더에 넣으면 스크립트 파일이 어디에 있든 모듈, 패키지를 사용할 수 있다.
  • 만약 가상 환경을 만들어서 모듈과 패키지를 관리한다면 가상환경/Lib/site-packages 폴더에 모듈과 패키지가 들어간다.


8. 패키지에서 from import 응용하기

  • 지금까지 calcpkg 패키지의 모듈을 가져올 때 import calcpkg.operation처럼 import 패키지.모듈 형식으로 가져왔다.


  • 만약 import calcpkg처럼 import 패키지 형식으로 패키지만 가져와서 모듈을 사용하고 싶은 경우 calcpkg 패키지의 __init__.py 파일을 다음과 같이 수정한다.


from . import operation
from . import geometry


  • 파이썬에서는 __init__.py 파일은 폴더(디렉터리)가 패키지로 인식되도록 하는 역할도 하고, 이름 그대로 패키지를 초기화하는 역할도 한다.
  • 즉, import로 패키지를 가져오면 __init__.py 파일이 실행되므로 이 파일에서 from . import 모듈 형식으로 현재 패키지에서 모듈을 가져오게 만들어야 한다.


  • 이제 main.py에서 import calcpkg와 같이 패키지만 가져오도록 수정한 뒤 실행해 보자.


import calcpkg

print(calcpkg.operation.add(10, 20)) # 30
print(calcpkg.operation.mul(10, 20)) # 200

print(calcpkg.geometry.triangle_area(30, 40)) # 600.0
print(calcpkg.geometry.rectangle_area(30, 40)) # 1200


  • calcpkg__init__.py에서 하위 모듈을 함께 가져오게 만들었으므로 import calcpkg로 패키지만 가져와도 calcpkg.operation.add(10, 20)처럼 사용할 수 있다.


1) from import로 패키지에 속한 모든 변수, 함수, 클래스 가져오기

  • 앞에서 from import 문법 중에 *(애스터리스크)를 지정하여 모든 변수, 함수, 클래스를 가져오는 방법이 있었다.
  • 마찬가지로 패키지에 속한 모든 변수, 함수, 클래스를 가져올 수 있다.


  • 먼저 main.py에서 import calcpkgfrom calcpkg import *와 같이 수정하고, 각 함수들도 앞에 붙은 calcpkg.operation, calcpkg.gemetry를 삭제한뒤 실행해 보자.


from calcpkg import *

print(add(10, 20))
print(mul(10, 20))

print(triangle_area(30, 40))
print(rectangle_area(30, 40))

# NameError: name 'add' is not defined


  • 실행을 해보면 add가 정의되지 않았다면서 에러가 발생한다.
  • 왜냐하면 __init__.py에서 모듈만 가져왔을 뿐 모듈 안의 함수는 가져오지 않았기 때문이다.


  • IDLE의 파이썬 프롬프트에서 dir 함수를 호출하여 현재 네임스페이스를 확인해 보자.


>>> dir()
['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'geometry', 'operation']


  • 현재 네임스페이스에는 operation, geometry만 들어있어서 add, mul처럼 함수 이름만으로는 호출할 수가 없다.
  • 이때는 __init__.py에서 모듈 안의 함수를 가져오게 만들어야 한다.
  • 특히 현재 패키지(calcpkg)라는 것을 명확하게 나타내기 위해 모듈 앞에 .(점)을 붙인다.


from .operation import add, mul
from .geometry import triangle_area, rectangle_area


  • 이제 main.py 파일을 실행해 보면 결과도 잘 출력되고, add, mul, triangle_area처럼 함수 이름 그대로 호출할 수 있다.


  • 물론 __init__.py 파일에서 특정 함수(변수, 클래스)를 지정하지 않고 *를 사용해서 모든 함수(변수, 클래스)를 가져와도 상관없다.


from .operation import *
from .geometry import *


  • 이렇게 패키지의 __init__.py에서 from .모듈 import 변수, 함수, 클래스 또는 from .모듈 import * 형식으로 작성했다면 패키지를 가져오는 스크립트에서는 패키지.함수() 형식으로 사용할 수 있다.
  • 이때는 import calcpkg와 같이 패키지만 가져오면 된다.


import calcpkg

print(calcpkg.add(10, 20)) # 30
print(calcpkg.mul(10, 20)) # 200

print(calcpkg.triangle_area(30, 40)) # 600.0
print(calcpkg.rectangle_area(30, 40)) # 1200


  • __init__.py에서 from .모듈 import 변수, 함수, 클래스 또는 from .모듈 import * 형식으로 모듈을 가져오면 calcpkg 패키지의 네임스페이스에는 add, mul, triangle_area, rectangle_area가 들어간다.
  • 따라서 모듈을 거치지 않고 calcpkg.add처럼 패키지에서 함수를 바로 사용할 수 있다.


__all__로 필요한 것만 공개하기

  • 패키지의 __init__.py에서 from .모듈 import *로 모든 변수, 함수, 클래스를 가져오면 패키지 외부에 공개하고 싶지 않은 것까지 공개하게 된다.
  • 이때는 __all__에 공개할 모듈, 변수, 함수, 클래스를 리스트 형태로 지정해 주면 된다.


__all__ = ["add", "triangle_area"]

from .operation import *
from .geometry import *
from calcpkg import *

print(add(10, 20))
print(mul(10, 20))

print(triangle_area(30, 40))
print(rectangle_area(30, 40))

# 30
# NameError: name 'mul' is not defined


하위 패키지 사용하기

  • 파이썬의 패키지는 패키지 안에 하위 패키지를 만들 수 있다.
  • 즉, 패키지 안에 폴더(디렉터리)를 만들고 __init__.py와 모듈을 넣으면 하위 패키지가 된다.


  • 예를 들어서 다음과 같이 calcpkg 안에 operationgeometry 하위 패키지가 있고, 그 아래에 모듈이 들어있다.
  • import로 하위 패키지의 모듈을 가져올 때는 계층 순서대로 .(점)을 붙여서 가져오면 된다.


import 패키지.하위패키지.모듈


  • 즉, import calcpkg.operation.element와 같은 식이며, 만약 import calcpkg처럼 패키지만 가져와서 사용하고 싶다면 calcpkg/__init__.py에서 하위 패키지의 모듈에 들어있는 변수, 함수, 클래스를 모두 가져오게 만들면 된다.


from .operation.element import *
from .operation.logic import *
from .geometry.shape import *
from .geometry.vector import *


  • 이렇게 하면 calcpkg.add(10, 20), calcpkg.triangle_area(30, 40) 또는 add(10, 20), triangle_area(30, 40)처럼 사용할 수 있다.


  • 참고로 하위 패키지 안에서 옆에 있는 패키지의 요소를 가져와서 사용하려면 ..을 사용해야 한다.
  • ..은 상위 폴더(디렉터리)라는 뜻이며 ..패키지 또는 ..모듈은 상위 폴더에 있는 패키지, 모듈이라는 뜻이다.
  • 즉, 패키지와 같은 계층의 패키지 또는 모듈이고 ...은 상위 폴더의 상위 폴더라는 뜻이며 위로 갈수록 .이 하나씩 늘어난다.


from ..패키지 import 모듈
from ..패키지.모듈 import 클래스, 변수, 함수
from ..패키지.모듈 import *


  • 예를 들어 calcpkg/geometry/shape.py에서 옆에 있는 calcpkg/operation 패키지의 element 모듈을 사용한다면 다음과 같이 from ..operation import element로 지정해 준다.
  • 또는, from ..operation.element import mul과 같이 지정하면 mul을 함수 그대로 사용할 수 있다.


from ..operation import element

def triangle_area(base, height):
    return element.mul(base, height) / 2

def rectangle_area(width, height):
    return element.mul(width, height)


007


모듈과 패키지의 독스트링

  • 모듈의 독스트링은 모듈 파일의 첫 줄에 """ """(큰따옴표 세 개) 또는 ''' '''(작은따옴표 세 개)를 사용하여 문자열을 넣는다.


"""모듈의 독스트링"""


  • 패키지의 독스트링은 __init__.py 파일의 첫 줄에 """ """(큰따옴표 세 개) 또는 ''' '''(작은따옴표 세 개)를 사용하여 문자열을 넣는다.


"""패키지의 독스트링"""


  • 모듈과 패키지의 독스트링을 출력하려면 모듈 또는 패키지의 __doc__을 출력하면 된다.


모듈.__doc__
패키지.__doc__

References