#!/usr/bin/env python # coding: utf-8 # *** # *** # # 18. 모듈의 활용 및 패키지 # *** # *** # *** # ## 1 모듈의 다양한 import 방법 # *** # ### 1-1 모듈 import 하기 # #### 1) import 모듈명 # - 가장 기본적인 형태 # - 현재의 이름 공간에 mymath 이름이 유지되므로 mymath.area() 형태로 자격 이름 사용 # In[3]: import mymath print(mymath.area(5)) # #### 2) from 모듈명 import 이름들 # - 해당 모듈에 존재하는 지정 이름들을 현재 이름 공간으로 불러들인다. # - 불러들인 각 이름들은 모듈 이름 없이 직접 사용 가능하다. # - import 하는 이름들이 기존에 미리 존재하고 있었다면 그 이름들에 의해 참조되던 기존 객체들은 상실된다. # In[4]: from mymath import area, mypi print(area(5)) # #### 3) from 모듈명 import * # - 해당 모듈에 존재하는 '\_\_'로 시작되는 이름들을 제외한 모든 이름들을 현재 이름 공간으로 불러들인다. # In[5]: from mymath import * print(area(5)) # #### 4) import 모듈명 as 새로운 모듈 이름 # - 해당 모듈을 새로운 다른 이름으로 사용하고자 할 때 사용 # - 기존 모듈 이름이 너무 길거나 현재 사용중인 다름 이름들과 충돌이 일어날 때 유용 # In[2]: import string as chstr print(chstr) print() print(chstr.punctuation) # #### 5) from 모듈명 import 이름 as 새로운 이름[, 이름 as 새로운 이름] # - 해당 모듈 내에 정의된 이름을 다른 새로운 이름으로 사용하고자 할 때 사용 # In[1]: from string import punctuation print(punctuation) from string import punctuation as punc print(punc) # In[2]: from math import floor as flr, ceil as cil print(flr) print(flr(4.5)) print(cil) print(cil(4.5)) print() from math import floor, ceil print(floor(4.5)) print(ceil(4.5)) # - import 문은 보통의 문(statement)이 작성될 수 있는 곳이면 어디에서나 사용 가능 # - 예를 들면 함수 정의 def 문 안이나 if 문 안에서 사용할 수 있음 # In[40]: def str_test(s): import string t = string.split(s) return(t) # ### 1-2 import에 의한 모듈 코드 수행 # - import는 코드를 가져오기만 하는 것이 아니라 가져온 코드를 수행한다. # In[3]: #FILE : mymath.py mypi = 3.14 def add(a, b): return a + b def area(r): return mypi * r * r print(area(4.0)) # In[19]: import mymath #기존: #50.24 # ### 1-3 컴파일과 적재시간 # - import mymath를 수행할 때 발생하는 일 # - 1) 우선 mymath.pyc를 찾는다. # - 2) mymath.pyc가 없다면 mymath.py를 찾아서 mymath.pyc를 생성한다. # - 3) 생성된 mymath.pyc를 메모리로 읽어들여 수행한다. # - .pyc 파일 # - 바이트 코드 파일 # - 기계나 플랫폼(OS)에 의존하지 않도록 만들어진 일종의 목적 코드 (Object Code) # - 파이썬은 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다. # - 새로운 .pyc 생성에 대한 판단 # - .py 수정 시간이 .pyc 수정 시간보다 더 최근일 때 # - .py가 없이도 .pyc 파일만 있어도 import 가능 # - 코드를 숨기는 간단한 기법으로 활용 가능 # ### 1-4 모듈 이름과 이미 사용하고 있던 이름이 같다면? # - 이전의 이름이 참조하던 객체는 상실됨 # In[12]: string = "My first string" import string print(string) # In[13]: import string string = "My first string" #여기서 string이란 이름은 문자열을 참조하게 된다. print(string) # - 한번 import 되었던 모듈은 메모리에 적재되어지고, 나중에 다시 동일한 모듈을 import하면 메모리에 적재되어 있던 모듈이 즉시 사용된다. # In[4]: import string string.a = 1 string = "My first string" print(string) import string print(string.a) # 여기서 string 모듈이 기존에 이미 등록되었던 것임을 알 수 있다. # *** # ## 2 모듈의 실행과 테스트 코드 # *** # - \_\_name\_\_ # - 모듈의 이름이 자동으로 저장되는 변수 # - 현재의 모듈이 최상위 모듈로서 수행되는지, 아니면 다른 모듈에 의해 import되어 수행되는지를 구별하기 위해 주로 활용 # - 최상위 모듈: 파이썬 인터프리터가 기본적으로 가장 먼저 인식하여 처리하는 모듈 # - 모듈의 이름이 항상 "\_\_main\_\_" # - prname.py를 직접 수행할 때의 출력 내용: \_\_main\_\_ # - \>\>\> ipython prname.py # - \_\_main\_\_ # - prname.py가 최상위 모듈로서 수행됨을 의미 # In[5]: #FILE : prname.py print(__name__) # - prname.py가 모듈로서 다른 이름 공간으로 import 되어질 때의 출력 내용: prname # In[6]: import prname print(prname.__name__) # In[8]: import string print(string.__name__) import re print(re.__name__) import os print(os.__name__) # - 아래 코드는 최상위 모듈로서 수행될 때 add() 함수 호출이 일어난다. # - 보통 파이썬 모듈을 개발할 때에는 마지막 부분에 if \_\_name\_\_ == "\_\_main\_\_": 과 같은 코드를 추가하여 테스트 코드를 삽입한다. # In[9]: #file: module_test.py def add(a, b): return a + b def f(): print("Python is becoming popular.") if __name__ == "__main__": print(add(1, 10)) f() # - 정의된 모듈이 다른 모듈로 import되어질 때에는 \_\_name\_\_은 모듈 이름 자체이므로 위 코드에서 if 문이 수행되지 않는다. # - 즉, test() 함수 호출이 곧바로 되지 않는다. # In[10]: import module_test # *** # ## 3 패키지 # *** # ### 3-1 패키지의 이해 # - 패키지 (Package) # - 여러 모듈들을 한데 묶어서 정리해 놓은 구조 # - 물리적으로 여러 모듈 파일을 모아 놓은 디렉토리에 해당 # - 최상위 디렉토리 이름이 패키지 이름이 된다. # - 최상위 디렉토리 하위에 여러 서브 디렉토리는 해당 최상위 패키지의 하위 패키지가 된다. # - 예제: Speech 패키지 # - 각 폴더마다 \_\_init\_\_.py 파일 존재에 유의 # - 패키지가 임포트 되면 \_\_init\_\_.py 파일에 존재하는 내용은 자동으로 실행됨 # ![inheritance](../images/package.png) # In[33]: import Speech # - Speech 디렉토리의 위치 # - sys.path(또는 PYTHONPATH 환경 변수)에 열거된 폴더 중 하나에 위치해야 한다. # - Speech/Recognition/HMM.py 코드 내용 # In[34]: def train(): print("Train") pass def loadModel(): print("LoadModel") pass def saveModel(): print("SaveModel") pass # ### 3-2 \_\_init\_\_.py의 역할 # - \_\_init\_\_.py 파일이 존재해야지만 파이썬 패키지로서 인식됨 # ### 3-3 import 하기 # In[2]: import Speech # In[3]: Speech.Recognition.HMM.train() # In[4]: import Speech.Recognition.HMM Speech.Recognition.HMM.train() # In[37]: from Speech.Recognition import HMM HMM.train() # In[38]: from Speech.Recognition.HMM import train train() # ### 3-4 import * 하기 # In[39]: from Speech.Recognition.HMM import * train() loadModel() saveModel() #

참고 문헌: 파이썬(열혈강의)(개정판 VER.2), 이강성, FreeLec, 2005년 8월 29일