[Python] 모듈과 패키지(import)


Study/Python  2019. 12. 13. 19:26

안녕하세요. 명월입니다.


이 글은 Python의 모듈과 패키지(import)에 대한 글입니다.


Python에서 모듈의 의미는 확장자가 py로 되어있는 Python 코드가 담겨져 있는 파일을 의미합니다. 그 뜻은 제가 main.py를 작성하고 그 안에 Python 코드를 넣게 되면 main 모듈이라고 할 수 있습니다.

다른 언어들은 파일에 대한 의미는 크게 중요하지 않고 namespace나 package 단위와 클래스 단위 중심으로 움직입니다. 물론 Java나 C#같은 컴파일 언어는 컴파일을 하면 하나의 파일로 합쳐지기 때문에 파일에 대한 의미가 없습니다.


Python은 컴파일 언어가 아니고 스크립트 언어이기 때문에 파일 단위의 의미가 있는 것일지도 모릅니다.

# 같은 디렉토리 안에 있는 example.py 파일을 등록한다.
import example;

# example.py 파일 안에 있는 print_function함수를 호출한다.
example.print_function();
def print_function():
  print("hello world");

위 예제를 보면 import 키워드로 example.py 파일을 등록합니다. 여기서 중요한 것은 확장자가 .py여야 하는 것입니다.

그리고 example.print_function()으로 example 안에 있는 함수를 호출합니다.


이런 모듈이 많은 것을 디렉토리로 관리할 수 있습니다. 이런 디렉토리 안에 있는 모듈을 패키지라고 합니다.

from example import example1,example2;

# example1.py 모듈의 print_function함수를 호출한다.
example1.print_function();
# example2.py 모듈의 print_function함수를 호출한다.
example2.print_function();
def print_function():
  print("example1 call");
def print_function():
  print("example1 call");

여기서 패키지 디렉토리 안에는 __init__.py가 있어야 합니다. __init__.py가 있어야 패키지로 인식을 합니다. (python 3.3부터는 생략이 가능하다고 하네요...)

참조 - https://dojang.io/mod/page/view.php?id=2449


그럼 제가 example 폴더에 있는 example1.py와 example2.py파일을 똑같이 test폴더를 하나 더 만들고 import 해보겠습니다.

from example import example1,example2;
from test import example1,example2;

# 이 함수는 test패키지의 example1.print_function인가? example 패키지의 example1.print_function인가?
example1.print_function();
example2.print_function();

에러는 발생하지 않지만 이전에 example 패키지의 example1.print_function를 사용할 수 없게 됩니다.

이럴 때는 패키지 명명법으로 해결할 수 있습니다.

from example import example1, example2;
# as 키워드를 통해 모듈 명명을 바꿀 수 있다.
from test import example1 as test1, example2 as test2;

example1.print_function();
example2.print_function();
test1.print_function();
test2.print_function();

이렇게 우리는 다른 모듈과 패키지를 가져와서 사용할 수 있습니다.


파이썬은 사용자, 즉 프로그래머들을 위해 자주 사용하는 모듈과 패키지들은 미리 작성해 놓았는데 이를 파이썬에서는 표준 라이브러리라고 합니다.

링크 - 파이썬 표준 라이브러리


예제로 os모듈을 사용해 보겠습니다.

import os;

ret = os.name;
print(ret);

저는 윈도우에서 실행시켰기 때문에 nt라는 결과가 나옵니다.


별도로 파이썬 파일에 import this를 입력하고 실행하면 파이썬 계명이 나옵니다.

import this;

The Zen of Python, by Tim Peters 파이썬 계명 by Tim Peters


Beautiful is better than ugly. 아름다움이 추함보다 좋다.

Explicit is better than implicit. 명백함이 모호함보다 좋다.

Simple is better than complex. 단숨함이 복잡함보다 좋다.

Complex is better than complicated. 복합한 것보다 난해한 것보다 좋다.

Flat is better than nested. 단조로움이 중첩 된 것보다 좋다.

Sparse is better than dense. 여유로움이 밀집된 것보다 좋다.

Readability counts. 가독성은 중요하다.

Special cases aren't special enough to break the rules. 룰을 깰 정도로 특별한 건 없다.

Although practicality beats purity. 비록 실용성이 순수함을 앞설지라도..

Errors should never pass silently. 오류는 말없이 지나쳐선 안된다.

Unless explicitly silenced. 분명하게 조용하지 않는 한...

In the face of ambiguity, refuse the temptation to guess. 모호한 상황이라도 추측의 유혹을 떨쳐내야 한다.

There should be one-- and preferably only one --obvious way to do it. 그것을 할 수 있는 분명한 한 가지 방법이 있어야 한다. 그 방법이 유일하면 더 좋다.

Although that way may not be obvious at first unless you're Dutch. 네덜란드 사람이 아니라면, 처음에는 그 방법이 분명하지 않을 수 있다.

Now is better than never. 지금 하는 것이 하지 않는 것보다 좋다.

Although never is often better than *right* now. 지금 하지 않는 것이 지금 당장 하는 것보다 더 좋은 경우가 있다.

If the implementation is hard to explain, it's a bad idea. 설명하기 어려운 구현은 그것은 안 좋은 아이디어이다.

If the implementation is easy to explain, it may be a good idea. 설명하기 쉬운 구현은 좋은 아이디어이다.

Namespaces are one honking great idea -- let's do more of those! 네임 스페이스는 좋은 생각이다. 더 많이 사용하자.

파이썬 계명은 Python 뿐 아니라 모든 프로그램을 작성할 떄 꼭 염두에 두어야 할 좋은 말이네요..


여기까지 Python의 모듈과 패키지에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.