Module

Programming/Python 2013. 5. 1. 02:26 |


모듈이란, 파이썬 프로그램 파일 혹은 C 확장 파일로 프로그램과 데이터를 정의하고 있으며, 고객(client,  어떤 모듈을 호출하는 측)이 모듈에 정의된 함수나 변수의 이름을 사용하도록 허용하는것으로 정의한다.

모듈은 코드들을 묶어 재사용 가능하게 만드는 하나의 단위이다.

모듈은 서로 연관된 작업을 하는 코드들의 모임으로 구성된다. 작성 중인 모듈의 크기가 어느 정도 커지게 되면 일반적으로 관리 가능한 작은 단위로 다시 분할된다.

지나치게 큰 모듈은 개념적으로나 실행 효율면에서 좋지 않다.

이렇게 분리된 모듈은 코드의 독립성을 유지하여 나중에 재사용할 수 있도록 만드는 것이 좋다.


표준 모듈파이선 언어 패키지 안에 포함된 모듈

사용자 생성 모듈사용자가 직접 만든 모듈

써드 파티 모듈다른 업체나 개인이 만들어서 제공하는 모듈



모듈을 왜 사용하는가?

1) 코드를 재사용할 수 있다.

2) 모듈은 시스템 구성 요소의 기본 단위이다. 하나의 시스템을 모듈 단위로 분리해서 설계하는 것은 여러 면에서 작업의 효율을 높일 수 있다.

3) 모듈은 별도의 이름공간을 제공한다.

이름 공간이란? 이름(변수)이 저장되는 공간을 의미 (함수도, 클래스의 객체도 별도의 이름 공간이다.)


※ 앞 뒤에 두 개의 '_'이 붙은 이름들은 시스템에서 사용하고 있는 이름들이다.



모듈의 검색 경로

파이썬은 가장 먼저 현재 디렉토리를 찾고, 없으면 환경 변수 PYTHONPATH에 기술된 디렉토리의 목록을 검색한다.

ex) csh의 경우 : setenv PYTHONPATH ~/Desktop

ex) bash의 경우 : export PYTHONPATH=~/Desktop


모듈의 검색 경로 동적으로 바꾸기

프로그램 내에서 동적으로 검색 경로를 바꾸려면 sys 표준 모듈의 path 리스트를 이용한다.

sys.path는 파이썬이 검색하는 디렉토리의 모든 경로가 들어 있다.

ex) sys.path.append('~/Desktop')



import 에 대하여

1) import 모듈명

이 방법은 모듈의 네임 스페이스를 그대로 유지하므로 모듈 내의 이름을 부를 때는 '모듈 이름.이름' 형식을 이용한다.

ex) A.B.C는 객체 A에서 B를 찾고, 객체 A.B에서 C를 찾는다.


2) from 모듈명 import 이름(들)

이 방법은 모듈 내의 특정한 이름들을 현재의 네임 스페이스로 불러들인다. 따라서 이들 이름은 직접 참조가 가능하다.

만약, 기존에 모듈에서 불러온 이름과 동일한 변수가 있었다면 그 값은 상실된다.


3) from 모듈명 import *

모듈 안에 있는 '_'로 시작하는 이름을 제외한 모든 이름들을 현재의 이름 공간 안으로 불러들인다.


4) import 모듈명 as 새 이름

이 방법은 모듈 이름을 다른 이름으로 사용하고자 할 때 사용한다. 모듈 이름이 너무 길거나, 혹은 사용 중인 이름과 충돌이 일어날 때 유용하게 사용될 수 있다.


5) from 모듈명 import 이름 as 새 이름

이 방법은 모듈 내에서 정의된 이름을 다른 이름으로 사용하고자 할 때 사용한다.


6) from 모듈명 import (이름들..)

하나의 모듈에서 다수의 이름을 import할 때 다음과 같이 괄호를 사용할 수 있다.

ex) from string import (atoi, atol, upper)


※ import와 from은 실행 가능한 문이다. 따라서 보통의 문이 나올 수 있는 곳이면 어디에서나 사용 가능하다.

※ import와 from은 치환문이다. 즉, import mymath는 현재의 네임 스페이스에 mymath란 이름을 생성하고 이름 mymath는 모듈 객체를 참조한다.


import는 코드를 수행한다.  

import 했을 때, 모듈 안의 문들이 순차적으로 수행된다.



컴파일과 적재 시간

import 문은 *.pyc 파일을 먼저 찾는다. 

*.pyc 파일은 *.py 를 컴파일한 바이트 코드 파일이며, 바이트 코드 생성은 import 할 때(필요하다면) 자동적으로 수행된다.


※ byte code 란?

하나의 중간 언어, 즉, 사람이 보는 파이썬 언어와 기계가 수행하는 기계어의 중간 위치에 있는 언어이다. 이 중간 언어의 역할은 실행 파일을 기계나 플랫폼에 의존하지 않도록 만드는 일이다.

파이썬은 묵시적으로 필요하다면 자동적으로 컴파일되므로 컴파일 언어이면서 동시에 인터프리터 언어의 수행 방식을 취하고 있다. 이 때문에 얻어지는 편리함은 상당히 크다.


바이트 코드 생성이 필요한지의 판단은 파일 생성 시간을 기준으로 한다.

즉, a.py의 생성 시간이 a.pyc의 생성 시간보다 더 최근이라면 새로 컴파일을 한다.


*.pyc 파일은 이식 가능하여 다른 플랫폼 환경에서 수행 가능하다. 또한 소스.py 파일이 없어도 .pyc파일을 먼저 찾아 수행하므로, 코드를 숨기는 간단한 기법으로 활용 가능하다.


※ decompyle - 바이트 코드에서 소스 코드로 변환

바이트 코드가 있다면 소스 코드로 변환하는 것은 어렵지 않다. 이런 일을 해주는 툴이 http://www.goebel-consult.de/decompyle/ 에 공개되어 있다.

사용법은 간단하다.  a.pyc를 소스 코드로 변환하려면 다음과 같이 한다. 변환 결과는 화면에 표시된다.

ex) ./decompyle a.pyc     or     python decompyle a.pyc



문자열로 표현된 모듈 가져오기

모듈 이름이 문자열로 표현되어 있을 때, 그 이름의 모듈을 임포트하는 방법은, __import__ 함수를 사용하는 것이다.

aa = 're'

re = __import__(aa)


※ 한번 import 되는 module은 메모리에 적재되어 있다가 다른 module 에서 import 할 때도 같이 공유된다.



모듈의 재적재

모듈은 처음의 import에 대해서만 실행하고 적재한다. 이미 적재되어 있는 모듈의 import에 대해서는 기존의 잭재되어 있는 모듈을 그냥 이용한다.

파이썬을 이렇게 만든 이유는 재귀적인 import의 가능성 때문이다. 

ex) A.py

import B

ex) B.py

import A


import를 반복한다면 두 모듈은 무한 루프를 돌 것이다. 그래서 일단 메모리에 적재된 모듈은 다시 물리적인 임포트를 하지 않고 이용한다.

만일 모듈을 다시 적재하고 싶다면 "reload" 함수를 이용하면 된다

ex) reload(module)


모듈을 편집기를 이용하여 수정하고, 또 다른 화면에서는 그 모듈을 테스트할 때, reload를 이용하면 파이썬을 빠져 나가서 다시 import하지 않더라도 변경된 내용을 사용할 수 있어 편리하다.


※ 모듈의 재적재

모듈 reload는 해당 모듈만 재적재한다. 예를 들어 모듈 X가 Y를 임포트할 때, reload(X)는 모듈 X만을 재적재하며, Y를 재적재하지는 않는다.



Posted by scii
: