본문 바로가기

카테고리 없음

[Python] 패키지와 모듈 Import

반응형

모듈이란?

파이썬 인터프리터를 종료한 후에 다시 들어가면, 만들었던 정의들이 사라진다.(함수나 변수들)

조금 긴 프로그램을 쓰고자 하면, 편집기를 사용하여 소스코드를 작성하고 파일을 저장 시킨 뒤 스트립트나 인터프리터의 대화형 모드에서 사용할 수 있는 방법을 제공하는데 그런 파일을 모듈이라고 부른다.

 

패키지란?

  • 모듈들이 많아졌을 때 디렉터리 형태로 모듈들을 잘 분류해서 모아둔 폴더를 패키지라고 한다.
  • 패키지는 도트(.)를 사용하여 파이썬 모듈을 계층적(디렉터리 구조)으로 관리할 수 있게 해준다. 예를 들어 모듈 이름이 A,B인 경우에 A는 패키지 이름이 되고 B는 A 패키지의 B 모듈이 된다.

 

무슨 말인고 하니 결국 모듈을 import 할 때 디렉터리 구조로 해서 계층적으로 사용할 수 있게 만들어 주는 것이다

mammal/
    __init__.py
    human/
        __init__.py
        run.py
        speak.py
    lion/
        __init__.py
        run.py
        eat.py
    tiger/
        __init__.py
        run.py
        sleep.py

이렇게 패키지가 있다고 해 보자

 

패키지 안의 함수를 실행하는 세 가지 방법

 

첫 번째 방법

 

파이썬의 루트 경로에서 모듈까지 import해 준다

import manmal.human.run ## 파이썬의 루트 경로에서 모듈까지 import해 준다

manmal.human.run.run_test()

 

두 번째 방법

 

모듈이 있는 디렉터리의 경로 까지 from 에 적고 모듈을 import 하여 실행하는 방법

from manmal.human import run ##모듈이 있는 디렉터리의 경로 까지 from 에 적고 모듈을 import 하여 실행

run.run_test()

 

세 번째 방법

 

from에 모듈까지 적은 다음 함수를 직접 import하여 실행하는 방법

from manmal.human.run import run_test ##from에 모듈까지 적은 다음 함수를 직접 import하여 실행하는 방법

run_test()

 

다음과 같은 사용은 불가능하다

import manmal

manmal.human.run.run_test()

 

다음처럼 run_test 함수를 사용하는 것도 불가능 하다

import manmal.human.run_test

도트 연산자(.)를 사용해서 import a.b.c 처럼 import할 때 가장 마지막 항목인 c는 반드시 모듈 또는 패키지여만 한다.

 

__init__.py의 용도

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 만약 human, lion, tiger 등 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식되지 않는다.

 

python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다. 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

 

다음을 따라해 보자

>>> from manmal.human import *
>>> run.run_test()
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
NameError: name 'run' is not defined

이상하다 manmal.human 패키지에서 모든 것을 import 하였으므로 run 모듈을 사용할 수 있을 거 같은데 NameError가 발생 했다

 

이렇게 특정 디렉터리의 모듈을 *를 사용하여 import 할 때에는 다음과 같이 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.

#manmal/human/__init__.py

__all__ = ['run']

여기서 __all__이 의미하는 것은 human 디렉터리에서 * 기호를 사용하여 import할 경우 이곳에 정의된 echo 모듈만 import 된다는 의미이다.

 

착각하기 쉬운데 from manmal.human.run import *는 __all__과 상관없이 무조건 import 된다. 이렇게 __all__과 상관없이 무조건 import 되는 경우 from a.b.c import * 에서 from의 마지막 항목인 c가 모듈인 경우이다.

 

위와 같이 __init__.py 파일을 변경한 후 위 예제를 수행하면 원하던 결과가 출력된다.

from manmal.human import *

run.run_test()

 

 

 

참고

 

python 문서 모듈

 

6. 모듈 — Python 3.8.2 문서

6. 모듈 파이썬 인터프리터를 종료한 후에 다시 들어가면, 여러분이 만들었던 정의들이 사라집니다 (함수나 변수들). 그래서, 좀 긴 프로그램을 쓰고자 한다면, 대신 인터프리터 입력을 편집기를 사용해서 준비한 후에 그 파일을 입력으로 사용해서 실행하는 것이 좋습니다. 이렇게 하는 것을 스크립트 를 만든다고 합니다. 프로그램이 길어짐에 따라, 유지를 쉽게 하려고 여러 개의 파일로 나누고 싶을 수 있습니다. 여러 프로그램에서 썼던 편리한 함수를 각 프로그램에

docs.python.org

점프 투 파이썬

반응형