1. 모듈

모듈(Module)은 파이썬 코드를 논리적으로 묶어서 관리하고 사용할 수 있도록 하는 것으로, 보통 하나의 파이썬 .py 파일이 하나의 모듈이 된다.

 

모듈 안에는 함수, 클래스, 혹은 변수들이 정의될 수 있으며, 실행 코드를 포함할 수도 있다.

파이썬은 기본적으로 상당히 많은 표준 라이브러리 모듈들을 제공하고 있으며, 3rd Party에서도 많은 파이쎤 모듈들을 제공하고 있다.

 

이러한 모듈들을 사용하기 위해서는 모듈을 import하여 사용하면 되는데, import 문은 다음과 같이 하나 혹은 복수의 모듈을 불러들일 수 있고 별칭을 붙일 수도 있다.

import 모듈1
import 모듈1, 모듈2, 모듈3 ...
import 모듈명 as 별칭

 

예를 들어, 아래 예제는 표준 라이브러리 중 수학과 관련된 함수들을 모아 놓은 "math" 모듈을 import 하여 그 모듈 안에 있는 factorial() 함수를 사용하는 예이다.

import math
n = math.factorial(5)

 

하나의 모듈 안에는 여러 함수들이 존재할 수 있는데, 이 중 하나의 함수만을 불러 사용하기 위해서는 아래와 같이 "from 모듈명 import 함수명"이라는 표현을 사용할 수 있다. 이렇게 from...import... 방식으로 import 된 함수는 호출시 "모듈명.함수명"이 아니라 직접 "함수명"만을 사용한다.

# math모듈의 factorial 함수만 import
from math import factorial
n = factorial(5) / factorial(3)

 

하나의 모듈 안에는 있는 여러 함수를 사용하기 위해 from... import (함수1, 함수2) 와 같이 import 뒤에 사용할 함수를 나열할 수도 있다.

또한, 모든 함수를 불러 사용하기 위해서는 "from 모듈명 import *" 와 같이 별표(*)를 사용할 수 있다.

이렇게 from...import... 방식으로 import 된 함수는 호출시 모듈명 없이 직접 함수명을 사용한다.

# 여러 함수를 import
from math import (factorial,acos)
n = factorial(3) + acos(1)

# 모든 함수를 import
from math import *
n = sqrt(5) + fabs(-12.5)

 

함수의 이름이 길거나 어떤 필요에 의해 함수의 이름에 별칭(예시에서는 f)을 주고 싶은 경우가 있는데, 이 때는 아래와 같이 "함수명 as 별칭" 과 같은 표현을 사용할 수 있다.

# factorial() 함수를 f()로 사용 가능
from math import factorial as f
n = f(5) / f(3)

 

 

 

 

 

 

2. 모듈의 위치

파이썬에서 모듈을 import 하면 그 모듈을 찾기 위해 다음과 같은 경로를 순서대로 검색한다.

  1. 현재 디렉토리
  2. 현재 디렉토리에서 모듈이 발견되지 않으면 Python은 쉘 변수 PYTHONPATH의 각 디렉토리를 검색합니다.
  3. 위의 방법이 실패하면 Python은 기본 경로를 확인합니다.

 

모듈 검색 경로는 시스템 모듈 sys에 sys.path 변수로 저장됩니다.

sys.path 변수에 리스트 형태로 확인해보면 현재 디렉토리, PYTHONPATH 및 설치 종속 기본값이 들어 있습니다.

또한 sys.path를 사용하기 위해서는 sys라는 시스템 모듈을 import 해야 하며, sys.path는 임의로 수정할 수도 있다.

 

예를 들어, 기존 sys.path에 새 경로를 추가(append)하면, 추가된 경로도 이후 모듈 검색 경로에 포함된다

모듈을 import 하면 sys.path에 있는 경로 순서대로 모듈을 찾아 import하다가 만약 끝까지 찾지 못하면 에러가 발생된다.

 

 

다음은 Windows, Linux 시스템에서 일반적인 PYTHONPATH입니다.

 

Windows

set PYTHONPATH = c:\python20\lib;

Linux

set PYTHONPATH = /usr/local/lib/python

 

아래는 sys.path를 출력해 본 예인데, sys.path[0]의 값은 빈 문자열(empty string)로 이는 현재 디렉토리를 가리킨다.

즉, 먼저 현재 디렉토리부터 찾는다는 뜻이다.

 

마지막 라인은 sys.path.append()를 사용하여 새 경로를 추가하는 예를 든 것이다.

 

 

 

 

 

 

3. 모듈의 작성

프로그램을 모듈로 나누어 코딩하고 관리하는 것은 종종 많은 장점이 있다.

사용자 함수 혹은 클래스를 묶어 모듈화하고, 이를 불러 사용하는 방법을 간략히 살펴보자.

우선 아래 두 개의 함수(add와 substract)를 mylib.py 라는 모듈에 저장한다.

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

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

 

모듈 mylib.py가 있는 디렉토리에서 그 모듈을 import 한 후, mylib의 함수들을 사용한다.

# exec.py
from mylib import *
i = add(10,20)
i = substract(20,5)

파이썬 모듈 .py 파일은 import 하여 사용할 수 있을 뿐만 아니라, 해당 모듈 파일 안에 있는 스크립트(작성된 .py 파일의 내용) 전체를 바로 실행할 수도 있다.

 

 

 

 

 

4. __ name__를 체크하는 이유

파이썬에서 하나의 모듈을 import 하여 사용할 때와 스크립트 전체를 실행할 때를 동시에 지원하기 위하여 흔히 관행적으로 모듈 안에서 name 을 체크하곤 한다.

 

예를 들면 아래같은 코드를 종종 본적이 있을 거다.

if __name__ == '__main__':
   코드

도대체 이 코드는 왜 사용하는 것일까요?

 

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

 

먼저 __name__부터 알아보겠습니다.

다음 내용을 프로젝트 폴더(C:\project) 안에 hello.py 파일로 저장하세요.

 

hello.py

print('hello 모듈 시작')
print('hello.py __name__:', __name__)    # __name__ 변수 출력
print('hello 모듈 끝')

그리고 다음 내용을 프로젝트 폴더(C:\project) 안에 main.py 파일로 저장한 뒤 실행해보세요.

 

main.py

import hello    # hello 모듈을 가져옴

print('main.py __name__:', __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'이 들어갑니다.

 

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

C:\project>python hello.py
hello 모듈 시작
hello.py __name__: __main__
hello 모듈 끝

 

hello.py 파일의 name 변수에는 'hello'가 아니라 'main'이 들어갑니다.

즉, 어떤 스크립트 파일이든 파이썬 인터프리터가 최초로 실행한 스크립트 파일의 name에는 'main'이 들어갑니다.

이는 프로그램의 시작점(entry point)이라는 뜻입니다.

 

파이썬은 최초로 시작하는 스크립트 파일과 모듈의 차이가 없습니다.

어떤 스크립트 파일이든 시작점도 될 수 있고, 모듈도 될 수 있습니다.

그래서 name 변수를 통해 현재 스크립트 파일이 시작점인지 모듈인지 판단합니다.

if name == 'main':처럼 name 변수의 값이 'main'인지 확인하는 코드는 현재 스크립트 파일이 프로그램의 시작점이 맞는지 판단하는 작업입니다.

즉, 스크립트 파일이 메인 프로그램으로 사용될 때와 모듈로 사용될 때를 구분하기 위한 용도입니다.

 

 

 

 

참조:

dojang.io/mod/page/view.php?id=2448

 

pythonstudy.xyz/python/article/17-%EB%AA%A8%EB%93%88-Module

 

 

 

반응형

+ Recent posts