Post List

2015년 8월 23일 일요일

Python 기초 #13 Package (패키지)

1. Package 란 ?

Package는 Directory를 계층화된 구조로 생성해 놓고, 그 안에 Module 을 넣어두고 import 에서 사용하는 것을 말합니다.

그냥 단순히 Directory를 계층으로 만들고 그 안에 Module을 두었다고 해서 Package라고 하지 않습니다.

예를 들어서 Luna / Star / calc.py 에서 calc 라는 Module을 import 하기 위해서는 해당 폴더 안에 들어가서 실행을 하거나, 해당 폴더를 system path에 추가해야 합니다.

이 경우 Luna 라는 Package를 생성하고 그 안에 Star 라는 Package를 생성 한 후에 calc.py 라는 Module을 추가하면 import Lina.Star.calc 로 참조가 가능합니다.

import Luna.Star.calc
 
print(Luna.Star.calc.Add(1,2))

그럼 일반 폴더와 Package는 어떻게 구분 될까요 ?
Package 는 일반 폴더 안에 __init__.py 파일이 있으면 Package로 처리합니다.
(Python 3.4 부터는 __init__.py 파일 없이 폴더만으로도 Package로 처리합니다.)

2. Package 사용법

실제로 Module로 사용되지 않고 Package 용으로 사용되는 Python 파일이 있습니다.

__init__.py : 해당 폴더가 Package 라는 것을 뜻합니다. 파일의 내용은 없습니다. (3.4 이후부터는 없어도 됩니다.)

그럼 3.4 부터는 해당 파일이 전혀 필요없을까요 ?
네 그렇습니다.
하지만 2.7 이전에서는 Package에서 사용되는 환경 변수를 선언하는데 사용됩니다.

__all__ : 해당 Package의 모든것 ( * )을 import 한다고 선언했을 때 참조할 Module 을 선언합니다. (3.4 이후부터는 없어도 됩니다.)

import Luna.Star.calc
from Luna.Star.calc import *
print(Add(1,2))
3

위와 같이 Module 명을 지정하고 모든 것을 import 할 경우에는 정상적으로 실행이 됩니다.

import Luna.Star.calc
from Luna.Star import *
print(Add(1,2))
name 'Add' is not defined.

하지만 위와 같이 Package 명까지만을 명시하고 모든 것을 참조할 경우에는 동작을 하지 않습니다.

import Luna.Star.calc
from Luna.Star import *
print(calc.Add(1,2))
3

해당 경로 이후의 모든 Package 및 Module을 명시할 경우에는 가능합니다.
(2.7이라면 아래와 같이 Star 폴더아래 __init__.py 파일에 __all__을 선언해야만 합니다.
__all__ = [ 'calc' ]

import Luna.Star.calc
from Luna import *
print(Star.calc.Add(1,2))
3

3. Package 접근법

Luna 아래에 Dev라는 Package(폴더)를 생성한 후 그 안에 mod.py Module을 생성하여 다음과 같이 입력합니다.

from Luna.Star.calc import *
 
def modTest():
    print(Add(1,2))

그런 다음 실행할 Python 프로그램을 다음과 같이 수정 후 실행합니다.

import Luna.Dev.mod
print(Luna.Dev.mod.modTest())
3

위에서 mod.py에서 calc Module을 사용하기 위해서 실행 프로그램 기준에서의 Full 경로를 다 적어주었습니다.

상대 경로를 이용하여 접근이 가능합니다.

.. : 부모 폴더로 접근
. : 현재 폴더로 접근

mod.py를 아래와 같이 수정하고 실행해도 정상적으로 동작합니다.

from ..Star.calc import *
 
def modTest():
    print(Add(1,2))

댓글 없음:

댓글 쓰기