본문 바로가기

Script/Python

17. Module

 
모듈은 여러 코드를 묶어 다른 곳에서 재사용할 수 있는 코드 모음을 말한다.
 
모듈에는 보통 비슷한 기능을 하는 함수나 큰 기능을 수행하는 데 필요한 
 
일련의 함수와 데이터가 포함된다.
 
 
사용방법
 
먼저 import 를 사용하여 파일 전체를 읽어올 수 있다.
 
import <모듈>
 
여기서 모듈 이름은 파이썬 파일의 이름이다.
 
lib.ph
 
class A:
    def a(self):
        return 'a'
 
test.ph
 
import lib
obj = lib.A()
print(obj.a())
 
lib.A()  처럼 쓰기 보다는 그냥 A() 처럼 현재 파일에 포함된 것처럼 쓰고 싶다면 아래 방법을 사용한다.
 
from <모듈> import <대상클래스 또는 함수명>
 
from <모듈> import *
 
test.ph
 
from lib import A
 
obj = A()
print (obj.a())
 
 
모듈의 경로
 
파이썬의 모듈은 파일기준으로 일어나기 때문에 파일의 위치가 중요하다.
 
보통 아래 3개중 하나의 위치에 모듈로 사용할 파이썬 파일을 위치시키면 된다.
 
  • 현재 작업 디렉터리
  • PYTHONPATH 환경변수에 등록된 위치
  • 파이썬 표준 라이브러리 디렉토리 ( 파이썬 설치시 셋팅됨 )
 
표준 라이브러리 디렉토리 경로는 아래의 방법으로 할 수 있다.
 
import sys
print (sys.path)
 
['H:\\Project\\Java\\MyPython1\\myphtyhon\\test\\example1',
 'H:\\Project\\Java\\MyPython1', 'C:\\Phython35\\DLLs', ...]
 
이 경로는 추가 / 삭제가 실행중에 가능하다.
 
import sys
sys.path .append("C:\\")
print(sys.path)
 
 
모듈 임포트 내부동작
 
1. sys.path 등 검색 디렉토리에서 모듈 찾기 
 
2. 모듈의 바이트 코드가 있으면 이를 바로 임포트 
 
3. 없으면 인터프리터를 이용해 해당 모듈 코들를 바이트 코드로 만든후 임포트
 
바이트 코드 (.pyc) 는 인터프리팅 된 object 파일 정도로 보면 되는데 메모리에 즉시 로딩할 수 있는 데이터다.
 
 
모듈 리로드
 
IDE 의 종료 등으로 인해 현재 인터프리터가 종료되지 않는 한 
 
기존의 바이트 코드를 그대로 이용하기 때문에 현재 코드에 곧 바로 반영되지 않게 된다.
 
이때 사용할 수 있는 것이 imp 모듈의 reload 라는 함수다.
 
이 함수를 사용하면 사용 시점에 다시 해당 모듈을
 
항상 다시 인터프리팅 하여 항상 최신의 결과를 얻을 수 있다. 
 
import lib
import imp
imp.reload (lib)
 
obj = lib.A()
print(obj.a())
 
 
__name__ 어트리뷰트
 
모듈을 임포트해서 사용하는 경우와 그렇지 않은 경우 ( 직접 모듈 개발 중인 경우 ) 를 구분하면
 
테스트 코드 등을 넣을 때 유용하다.
 
이때 사용하는 어트리뷰트가 __name__  이며 이 것이 직접 사용중일때 모듈 명은 '__main__' 이다.
 
즉 모듈의 코드가 메인으로 실행됐다는 뜻이다.
 
lib.ph
 
class A:
    def a(self):
        return 'a'
 
#test code 를 넣는다.
if __name__ == '__main__' :
    print("this is test code")
 
Output
   this is test Code
test.ph
 
import lib
obj = lib.A()
print(obj.a())
 
Output
   a
 
 

'Script > Python' 카테고리의 다른 글

18. Package  (0) 2020.01.15
16. Class  (0) 2020.01.15
15.  Generic  Operation With Containers  (0) 2020.01.15
14. Documentation  (0) 2020.01.15
13. pass  (0) 2020.01.15