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))
댓글 없음:
댓글 쓰기