본문 바로가기
Python/파이썬 기초

모듈(module)과 패키지(package), import - 파이썬 기초(22)

by 콩돌 2018. 12. 29.
반응형

참고 자료

https://docs.python.org/ko/3/tutorial/modules.html



파이썬 버전 3.7 기준



파이썬 모듈(module)과 패키지(package)


본 포스팅에서 다루는 내용은 다음과 같다.

모듈, 패키지, import 등.



모듈(module)

파이썬 인터프리터상 함수나 클래스 등을 만든다 하더라도 파이썬을 종료한다면 작성했던 코드는 전부 사라진다. 작성한 함수나 클래스를 계속해서 사용하고 싶다면 스크립트를 작성해놓고 나중에 불러오기(import)를 해서 불러오기를 하면 훨씬 유용하며, 이렇게 작성된 스크립트를 모듈(module)이라 한다.


모듈 작성법

  ○ 필요에 따라 작성한 스크립트를 모듈(module)이라 부른다.

  ○ 작성된 모듈은 .py 확장자를 가지는 것이 원칙이다. 

  ○ 아래의 예제는 상당히 단순한 모듈작성 예제이다. 

    ▷ 아래의 모듈에서 function1,2 라는 이름을 가진 함수들은 모듈을 이루는 모듈요소이다. 

    ▷ if __name__=="__main__":는  작성된 스크립트를 메인으로 실행됬을 경우에 if절의 내용을 실행한다는 의미한다. 즉, 모듈로써 불러와진다면 이 내용은 실행이 되지 않는다.


단순한 모듈 예)

# file name: module1.py


def function1(v1):

    return v1**2


def function2(v1, v2):

    return v1**2 + v2**2


if __name__=="__main__":

    print(function1(5))

    print(function2(2, 3))



모듈 불러오기 - import의 형식  

  ○ 모듈을 불러오기 위해서는 import 구문을 사용하면된다.

    ▷ 모듈을 불러오기 위한 import 구문의 형식은 여러개가 있는데 아래에 형식이 소개되어있다. 


import의 형식)

① import <module name>

② from <module name> import <module element>

③ import <module name> as <nickname>

④ from <module name> import <module element> as<nickname>


  ① import <module name>

    - <module name>에는 모듈의 이름을 넣으면되며 확장자인 .py나 .pyc는 생략이 가능하다.

    - import 구문을 통해 불러온 모듈에서 함수나 클래스를 사용하고 싶으면 점으로 구분된 형태 예를들어, 모듈명.함수(입력) 형태로 사용하면 된다.


import <module name>의 사용 예)

In[3]: import module1

In[4]: module1.function1(5)

Out[4]: 25


  ② from <module name> import <module element>

    - <module name>에는 모듈의 이름을 넣으면되며 <module element>에는 모듈 내에 있는 불러오고자 하는 함수 요소를 넣으면 된다.

    - 모듈 내에 있는 모든 요소를 불러오고자 한다면 <module element>자리에 *을 넣으면 된다.

    - 불러와진 모듈 요소를 사용하기 위해 모듈명을 입력할 필요없이 바로 모듈요소명을 입력하여 사용하면된다.

  ※ 이러한 형태로 사용하는 모듈 혹은 패키지를 import하는 것은 추천되지 않는데, 여러 모듈 혹은 패키지를 import할 경우 같은 이름을 가지는 요소가 있을 경우에 혼동을 일으킬 가능성이 크기 때문이다.


from <module name> import <module element>의 사용 예)

In[2]: from module1 import function1

In[3]: function1(5)

Out[3]: 25


  ③ import <module name> as <nickname> 

    - <module name>에는 모듈의 이름을 넣으면되며 <nickname>에는 작성할 코드에 모듈이름 대신 넣을 모듈의 별명을 입력하면된다.

    - 이 구문를 통해 불러온 모듈에서 함수나 클래스를 사용하고 싶으면 nickname.함수(입력) 형태로 사용하면 된다.

    - 모듈 이름이 길 경우 약자로 모듈명을 바꿔주기 위해 많이 사용된다.


from <module name>import <module element>의 사용 예)

In[2]: import module1 as mod1

In[3]: mod1.function1(5)

Out[3]: 25


  ④ from <module name> import <module element> as <nickname>

    - <module name>에는 모듈의 이름을 넣으면되며, <module element>에는 불러올 모듈 요소(함수 등)을 <nickname>에는 작성할 코드에 모듈 요소 이름 대신 넣을 별명을 입력하면된다.

    - 이 구문를 통해 불러온 모듈에서 함수나 클래스를 사용하고 싶으면 nickname(입력) 형태로 사용하면 된다.

  ※ ②와 유사한 이유로 사용에 주의를 요구한다.


모듈 불러오기 - 불러오는 모듈의 위치 검색
  ○ 위의 방법으로 모듈을 import 할 때, 모듈을 불러오기 위해 여러 폴더를 검색하게 된다. 
    ▷ 검색하는 폴더의 목록은 sys.path에 있는 폴더들에서 찾게된다.
  ※ 심볼릭 링크를 포함하는 디렉토리는 모듈 검색경로에 포함되지 않으므로 사용에 주의를 요한다.


컴파일된 파이썬 파일
  ○ 모듈의 로딩을 빠르게 하기 위해, 파이썬은 __pycache__ 디렉토리에 각 모듈의 컴퍼일된 버전을 module.version.pyc 라는 이름으로 캐싱한다.
    ▷ 쉽게 설명하면, 모듈을 빠르게 로딩하기 위해 컴파일을 파이썬에서 자체적으로 수행하는 것이며, pyc 확장자를 가진다. 자세한 내용은 참고자료에 설명되어있다.
  ○ 컴파일을 수행한다고 해서 프로그램의 실행 시간이 짧아지는 것은 아니며, 오직 로딩시간만 단축된다.


dir() 함수
  ○ dir(import된 모듈) 형태로 사용하면 모듈에서 정의된 요소(어트리뷰트)들을 문자열 및 리스트 형태로 출력한다. 

  ○ dir()로 오브잭트 입력 없이 사용될 경우에는 현재 지역에서의 변수나 불러온 모듈 및 패키지를 문자열 및 리스트로 출력한다.



패키지(package)

특정한 주제를 가진 모듈들을 모아놓아 따로 구성한다면 유용하게 쓰일 수 있는데 이것이 패키지이다.


패키지 구성

  ○ 패키지는 모듈의 모음으로 구성될 수 있으며, 또한 하위 패키지로도 구성이 가능하다.

  ○ 아래에 패키지의 형식이 나와 있다. 

  ○ 각 서브 패키지 안에 모듈의 이름은 각 서브패키지의 이름이 다르기 때문에 중복이 허용된다.


패키지의 형식)

package/

    __init__.py

    

    sub_package_1/

        __init__.py

        sub1_module1.py

        sub1_module2.py


    sub_package_2/

        __init__.py

        sub2_module1.py

        sub2_module2.py


    sub_package_3/

        __init__.py

        sub3_module1.py

        sub3_module2.py


  ※ __init__.py ?

    - 패키지 폴더 안에 __init__.py 라는 파일을 넣으면 그 폴더의 모듈 혹은 서브 패키지가 상위 패키지에 포함이 된다는 것을 표시해주는 표식 같은 것이다. 

    - 빈 파일을 넣어도 무방하며 패키지를 초기에 import할 때 실행해야할 코드가 있다면 내용을 작성해 놓아도 된다. 

    - 파이썬 3.3 이상 버전에서는 사용하지 않아도 된다고는 하지만, 혹시 모르니 패키지를 작성할때 넣어놓는 것이 좋다.


패키지의 import 구문

  ○ 기본적으로 패키지를 import 구문들을 적용하는 것은 모듈과 동일하다.

    ▷ 상위개념으로 패키지가 추가됬다는 것 외에 차이점은 없다. 

  ○ 단순하게 패키지를 import 할 경우 모듈에서와 유사하게 점으로 구분된 형태로 즉, 패키지.모듈.함수() 형태로 사용할 수 있다.

    ▷ 서브패키지가 포함되어 있을 경우 패키지.서브패키지.모듈.함수() 형태로 사용이 가능하다.

  ○ 다음 예는 위의 가상의 패키지 형식에서 import를 하고 모듈안에 함수를 사용하는 예이다. 


패키지의 import 사용 예)

In[2]: import package

In[3]: package.sub_package_1.sub1_module1.function1(input)


  ○ 패키지 내부에 모듈만 import하는 것도 가능하다.


패키지에서의 모듈 import 예)

In[2]: import package.sub_package_1.sub.module1

In[3]: package.sub_package_1.sub.module1.function1(input)


  ○ 위의 예에서는 모듈만 import하는 것이 가능하나 패키지 이름이 너무 길어지므로 import as 구문을 사용하여 별명을 사용하는 것이 더 유용하다. 


패키지에서의 모듈 import as 예)

In[2]: import package.sub_package_1.sub.module1 as mod1

In[3]: mod1.function1(input)


  ○ 위의 예 말고도 모듈에서 사용했던 다양한 import 구문은 전부 사용이 가능하다.


패키지에서의 *으로 import

  ○ 기본적으로 * 으로 import를 하는 것은 동일한 이름을 가지는 모듈이나 함수가 존재할때 중복되어 혼란이 생기므로 매우 주의를 요한다. 

  ○ *으로 import를 수행할 때 필요한 모듈 혹은 서브패키지를 설정하기 위해서는 위에서 설명한 __init__.py 내부에 내용을 적으면 된다.

    ▷ 예를들어 __init__.py 안에 __all__= ["sub_package_2", "sub_package_3"] 라는 코드를 적었을 경우 *를 통한 import를 수행하면 sub_package_2와 sub_package_3가 *로 import되고 sub_package_1은 제외된다.

    ▷ 서브 패키지에서도 동일하게 적용된다.

반응형

댓글