티스토리 뷰

728x90

파이썬은 지금까지 다룬 다양한 타입과 기본 제공 함수들을 통해서도 다른 프로그램밍 언어에서는 볼수 없는 상당히 유연한 모습을 보여주고 있는데 확장 모듈을 통해서 이보다 좀더 복잡한 문제들을 간편하게 해결하거나 기타 유용한 기능들을  활용 할 수 있습니다. 모듈은 파이썬의 클래스, 함수, 전역 변수 등을 묶어 놓은 것으로 용도에 따라 코드의 재사용성을 극대화 시켜 줍니다. 모듈을 사용하게 되면 얻는 유익을 정리해 보면 다음과 같습니다.


    • 연관성이 있는 모듈만을 로드하여 프로그램 시작 시간을 최소화.

    • 필요한 모듈을 손쉽게 추가하여 사용할 수 있습니다.

    • 별도의 네임스페이스를 가지고 있어서 다른 모듈과 독립적으로 작업할 수 있습니다.

    • 특정 모듈을 필요에 따라 대치시킬 수도 있습니다.


■ 모듈(module)의 정의와 사용


파이썬 모듈은 하나의 파일을 의미하고 모듈이름은 파일 이름과 동일 합니다(*.py 확장자 제외). 그렇지만 모듈이름이 곧 파일이름이라는 특성 때문에 파이썬 변수 생성 규칙과 파일명 생성 규칙을 모두 만족하는 이름이어야 합니다.


함수나 클래스의 Docstring 처럼 """ ... """ 형식으로 모듈의 문서화정보를 입력할 수 있고, 클래스의 메쏘드나 속성 처럼 모듈내 클래스, 함수, 전역 변수는 모듈의 속성 역할을 담당 합니다.

 

모듈을 로딩하려면 "import 모듈명"으로 기술하면 됩니다. import 모듈명을 수행하면 일단 해당 모듈이 이미 로딩된 상태인지를 확인하고 없으면 모듈명.py 파일이 존재하는지 파이썬 경로를 검색 합니다. 검색은 먼저 *.pyc를 먼저찾고 그 다음에 *.py를 검색 합니다. 검색 과정에서 PYTHONPATH 환경변수나 sys.path를 참조합니다. -S 옵션으로 경로를 지정한 경우에는 해당 경로를 참조 합니다. 


검색 경로에서 해당 모듈이 없으면 예외를 발생시키고 해당 모듈이 존재하면 모듈을 로딩하면서 모듈에 해당하는 네임스페이스를 생성 합니다. 이미 다른 프로그램에 의해 로딩된 적이 있는 모듈의 경우에는 프로그램에서 import 구분이 있더라도 이미 로딩되어 있는 것을 사용하기 때문에 변수 정의나 실행문이 있는 스크립트의 경우에는 재실행 되지 않으므로 주의해야 합니다. 만약에 이미 로딩되어 있는 모듈을 강제로 다시 로딩하고 싶을 때는 reload(모듈명)을 사용 합니다. 현재 파이썬의 기본 모듈 검색 경로는 python -c 'import sys; print sys.path'로 간편하게 확인할 수 있습니다. 윈도우 시스템의 경우에는 Python_Path 레지스트리 변수를 확인하는 방법도 있습니다.

 

모듈 내의 함수나 클래스를 사용하려면 클래스내의 메쏘드를 사용하는 방법 처럼 모듈명.함수명의 형식을 사용하면 됩니다. 모듈은 파이썬의 전역(globals()) 및 로컬(locals(), vars()) 변수들 처럼 별도의 네임스페이스를 갖기 때문에 "모듈명.var1 = 10" 처럼 모듈 네임스페이스에 변수를 정의하여 독립적으로 사용 할 수도 있습니다.

 

"from 모듈명 import 컴포넌트, 컴포넌트..."의 형식은 모듈을 모듈 네임스페이스로 로딩하는 것이 아니라 모듈 내에서 import로 지정한 특정 컴포넌트들을 현재의 네임스페이스(global 또는 local)로 로딩하는 것입니다. 로컬 또는 글로벌 네임스페이스에 위치하므로 모듈명.함수명()의 형식이 아니라 직접 함수명()으로 사용할 수 있게 됩니다.  컴포넌트 리스트 대신 *를 기술하면 모듈에서 _로 시작하는 컴포넌트를 제외한 나머지를 모두 현재의 네임스페이스로 로딩 합니다. __all__에 클래스나 함수명 등을 리스트 형태로 기술해 놓으면 import *를 수행할때 해당하는 속성들만 import 합니다.


from trac.versioncontrol import RepositoryManager

from trac.web.href import Href


__all__ = ['Environment', 'IEnvironmentSetupParticipant', 'open_environment']


# Content of the VERSION file in the environment

_VERSION = 'Trac Environment Version 1'


class ISystemInfoProvider(Interface):


위의 예제 코드는 __all__에 대상 클래스를 정의하고 있는 모습 입니다.


"import 모듈명 as 새모듈명"

"from 모듈명 import 컴포넌트 as 새컴포넌트"

위의 문법 형식은 모듈이나 컴포넌트를 로딩하면서 이름을 변경시키는 것으로 네임스페이스 충돌을 방지하거나 긴 이름에 대한 대처 등에 활용 할 수 있습니다.

 

하나의 파일에 클래스나 함수 정의만 있고 별다른 실행문이 없으면 라이브러리라 하고 실행문이 있으면 스크립트라 하는데 실행문이 있는 스크립트도 라이브러리 처럼 import 할 수 있습니다. 단, 이미 import 한 모듈의 경우에는 재실행 되지 않는 점만 주의하면 됩니다. 초기 실행 프로그램 또는 가장 상위의 스크립트인지를 구별하는 방법이 있는데 바로 __name__ 전역변수를 활용하는 것으로 스크립트는 이 변수의 값에 "__main__"이 있습니다.




■ 모듈의 설치


완성된 파이썬 모듈을 설치하는 방법은 다음과 같습니다. 한가지 주의 할 점은 설치 이전에 테스트 하던 파일들이 있다면 혼란이 없도록 미리 정리할 필요가 있다는 것입니다.


  • 모듈을 파이썬홈의 site-packages 폴더에 위치 저장 합니다(통상 파이썬홈/lib/site-packages 디렉토리 입니다)

  • 임의의 폴더에 모듈을 두고 site-packages 폴더에 파일 링크를 위치 시킵니다.

  • 임의의 폴더에 모듈을 두고 site-packages 폴더에 있는 .PTH 파일에 모듈의 경로를 추가 합니다.

  • 임의의 폴더에 모듈을 두고 PYTHONPATH 환경변수에 모듈의 경로를 추가 합니다.




■ 패키지의 정의와 사용


패키지는 모듈을 묶어놓은 것으로  모듈을 가지고 있는 디렉토리라고 말할 수 있습니다. 디렉토리가 다른 디렉토리를 포함하는 형태로 구조화시키서 패키지.모듈명의 형식으로 사용 할 수도 있습니다. 




위의 그림은 협업 개발 플랫폼인 trac 패키지의 디렉토리 구조로 각 개별 폴더마다 __init__라는 특별한 모듈이 있음을 확인 할 수 있습니다.


__init__ 파일은 패키지를 로딩할 때 실행하는 파일로 통상 초기화 스크립트를 기록해 둡니다. 그 내용은 어떤 것이 와도 관계 없습니다. 아래는 trac.ticket 패키지의 __init__ 예제 입니다. 폴더에 __init__ 스크립트가 있으면 파이썬 패키지로 인식하면 됩니다.


from trac.ticket.api import *

from trac.ticket.default_workflow import *

from trac.ticket.model import *


"import 패키지명"으로 기술할 수 있고 "from  패키지 import 모듈명"으로 특정 모듈만을 import 할 수도 있습니다. 패키지 내부 코드에서 패키지내 다른 모듈을 참조할 경우에는 반드시 패키지.모듈명 형식으로 전체 경로를 모두 기술해 주어야 합니다. 또한 패키지를 로딩 할 때 하위의 모듈들을 자동으로 로딩하지 않기 때문에 __init__를 적절하게 활용하거나 필요한 모듈을 직접 import 해야 합니다. "from 패키지 import *" 형식으로 모듈들을 일괄로 로깅 할 경우에는 모듈내 로딩 대상 속성들을 __all__ 변수에 리스트로 설정한 것처럼 __init__파일에 로딩 대상 모듈을 리스트 형태로 기술해 놓아야 합니다.



728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함