Python

모듈

Raccoon2125 2020. 11. 1. 23:50

1. 모듈(Module)

모듈은 파이썬 코드를 논리적으로 묶어서 관리하고 사용할 수 있도록 하는 것으로, 보통 하나의 파이썬 .py파일이 하나의 모듈이 된다. 모듈 안에는 함수, 클래스, 혹은 변수들이 정의될 수 있으며, 실행 코드를 포함할 수도 있다.

 

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

 

(1) math 모듈 부르기

import math
n = math.factorial(5)

(2) math 모듈 내의 특정 함수 부르기

from math import factorial
n = factorial(5) / factorial(3)

여러 함수를 사용하기 위해서는 'from ... import 내용'에서 내용에 해당하는 함수를 나열하면 된다.

또한, 모든 함수를 불러 사용하기 위해서는 "from 모듈명 import *"와 같이 asterisk(*)를 사용할 수 있으며, 이런 방식으로 import된 함수는 호출 시 모듈명 없이 직접 함수명을 사용하게 된다.

 

(3) 여러 함수를 import

from math import (factorial, acos)
n = factorial(3) + acos(1)

(4) 모든 함수를 import

from math import *
n = sqrt(5) + fabs(-12.5)

 

2. 모듈의 위치

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

    01. 현재 디렉토리

    02. 환경변수 PYTHONPATH에 지정된 경로

    03. Python이 설치된 경로 및 그 밑의 라이브러리 경로

  이러한 경로들은 모두 취합되어 시스템 경로인 sys.path에 리스트 형태로 저장된다. 따라서, 모듈이 검색되는 검색 경로는 sys.path를 체크하면 쉽게 알 수 있다. 모듈을 import할 때 sys.path에 있는 경로 순서대로 모듈을 찾아 import를 진행하고 만약 진행이 불가할 경우 에러가 발생된다.

  sys.path를 사용하기 위해서는 sys라는 시스템 모듈을 import 해야 하며, sys.path는 임의로 수정이 가능하다.

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

 

아래는 sys.path를 출력해 본 예인데, sys.path[0]의 값은 빈 문자열(empty string)로 이는 현재 디렉토리를 가리킨다.
즉, 먼저 현재 디렉토리부터 찾는다는 뜻이다. 마지막 라인은 sys.path.append()를 사용하여 새 경로를 추가하는 예를 든 것이다.

3. 모듈의 작성

- 프로그램을 모듈로 나누어 코딩하고 관리하는 것은 종종 많은 이점이 있다. 사용자 함수 혹은 클래스를 묶어 모듈화하고, 이를 불러 사용하는 방법이 가능하기 때문이다. 이런 방식을 활용하면, 기존에 있던 클래스의 Big-O가 좋지 못할 경우, 커스텀으로 알고리즘을 짜서 넣어서 성능 향상을 기대할 수 있다.

ex)

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

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

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

# exec.py
from mylib import (add, subtract)

i = add(10, 20)
i = subtract(20, 5)

 

- 파이썬 모듈 .py 파일은 import하여 사용할 수 있을 뿐만 아니라, 해당 모듈 파일 안에 있는 스크립트 전체를 바로 실행시킬 수도 있다. 파이썬에서 하나의 모듈을 import하여 사용할 때와 스크립트 전체를 실행할 때를 동시에 지원하기 위하여 흔히 관행적으로 모듈 안에서 __name__을 체크하곤 한다. 파이썬에서 모듈을 import해서 사용할 경우 그 모듈 안의 __name__은 해당 모듈의 이름이 되며, 모듈을 스크립트로 실행할 경우 그 모듈 안의 __name__은 "__main__"이 된다.

# run.py
import sys
def openurl(url):
	#..본문 생략..
    print(url)
    
if __name__ == '__main__':
	openurl(sys.argv[1])

  위와 같은 run.py 모듈을 아래와 같이 스크립트로 실행할 때 "if __name__ ..." 조건문은 참이 되어 openurl(sys.argv[1]) 가 실행된다. 여기서 참고로 sys.argv는 Command Line 아규먼트들을 갖는 리스트로서 아래 예제에서 argv[0]은 run.py, argv[1]은 google.com이 된다. (쉘 스크립트 문법)

$ python3.5 run.py google.com
google.com

하지만 아래와 같이 모듈을 import하여 사용할 때는 "if __name__ ..." 문이 거짓이 되어 openurl() 함수가 바로 실행되지 않고, 그 함수 정의만 import 된다. 따라서 이 경우 사용자는 명시적으로 openurl() 함수를 호출하여 사용해야 한다.

$ python3.5 
>>> from run import *
>>> openurl('google.com')