1. 패키지
2. 패키지 만들기
3. 패키지 활용하기
4. relative 패키지
1. 패키지
패키지는 모듈(파이썬 파일)들이 모여있는 폴더다.
다만, 편하게 모듈끼리 불러내면서 사용하기 위해, 안정성을 위해
원하는 용도 및 취지 별로(공동 작업이나 유지 보수 등) 그룹핑을 한 폴더 그룹을 말한다.
패키지 구조의 예
C:/Lee/Cal/
__init__.py
C:/Lee/Cal/easyCal/
__init__.py
add.py
sub.py
C:/Lee/Cal/hardCal/
__init__.py
mul.py
div.py
__init__.py 파일은 해당 디렉터리(폴더)가 패키지의 일부임을 알려주는 역할을 한다.
만약 __init__.py 파일이 없다면 패키지로 인식되지 않는다.
__init__.py 파일은 내용을 비워 둘 수 있다.
※ 참고
python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420).
하지만 하위 버전 호환을 위해 쓰는 것이 안전하다.
2. 패키지 만들기
(1) 기본 구성요소를 먼저 생성한다.
각 폴더와 하위 폴더, 그리고 py 파일들을 생성한다.
C:/Lee/Cal/__init__.py
C:/Lee/Cal/easyCal/__init__.py
C:/Lee/Cal/easyCal/addfile.py
C:/Lee/Cal/hardCal/__init__.py
C:/Lee/Cal/hardCal/mulfile.py
(2) init 파일은 비워두고, add와 mul 파일의 내용을 넣는다.
def add(a,b):
print(a+b)
def mul(a,b):
print(a*b)
(3) import 를 디렉토리 상관없이 사용하기 위해 PYTHONPATH를 설정해 놓는다.
C:\> set PYTHONPATH=C:/Lee
C:\> python
Type "help", "copyright", "credits" or "license" for more information.
>>>
만들기 끝!
3. 패키지 활용하기
만든 함수들을 불러내는 방법은 앞에서 배웠다. (5-2 장)
(1) import 패키지.모듈
패키지.모듈.변수/함수()/클래스()
>>> import Cal.easyCal.addfile
>>> Cal.easyCal.addfile.add(1,3)
4
위의 import에서는 모듈까지만 쓸 수 있다. 그 하위 속성은 사용하면 에러난다.
그리고 함수를 사용할 때에도 패키지~모듈까지 모두 적고 함수를 써야 한다.
(2) from 패키지.모듈 import 변수/함수/클래스
>>> from Cal.hardCal.mulfile import mul
>>> mul(1,3)
3
>>> from Cal.hardCal import mulfile
>>> mulfile.mul(1,3)
3
마찬가지로 from 에는 모듈까지만 적고 import에 하위 속성을 적어야 한다.
여기 import에는 모듈도 와도 된다. 그럼 (1) 방법처럼 import 에 적힌 모듈을 적고 함수를 써야한다.
해당 방법은 함수 사용 시 편하다.
(3) 주의 및 참고
1.
>>> import Cal
>>> Cal.easyCal.addfile.add()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'sound'
첫번째 예시처럼 import를 한다면 사용은 불가하다.
사용할 수 있게 하려면 Cal 디렉터리의 __init__.py에 정의한 것만 참조할 수 있다.
(참조 방법은 바로 아래에 나옴)
2.
>>> from Cal.easyCal import *
>>> addfile.add()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'addfile' is not defined
위의 ' * ' 사용도 불가하다.
별표의 사용이 가능하려면 아래처럼 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고
import할 수 있는 모듈을 정의해 주어야 한다.
만약 두번째 예시에서 from Cal.easyCal import * => from Cal.easyCal.addfile import * 이었다면
정상 동작을 했을 것이다. from의 마지막이 모듈이면 import가 사용 가능 하다는 말이다.
# __init__ 참조 방법
# C:/Lee/Cal/easyCal/__init__.py 안에
__all__ = ['addfile']
위의 _all__이 의미하는 것은 easyCal 디렉터리에서
* 기호를 사용하여 import할 경우 이곳에 정의된 addfile모듈만 import된다는 의미다.
4. relative 패키지
서로 다른 패키지(폴더)에 있는 모듈들은
모듈 내부에서 import로 다른 폴더의 모듈을 불러오면
다른 폴더에 있더라도 사용할 수 있다.
당연한 거다.
1.
# mulfile.py
from Cal.easyCal.addfile import add
def mul(a,b):
print(a*b)
add(a,b)
2.
# mulfile.py
from ..easyCal.addfile import add # 표현을 이렇게 할 수도 있다.
def mul(a,b):
print(a*b)
add(a,b)
2.
.. : 부모 디렉터리 (상위 디렉토리)
. : 현재 디렉터리
위의 방법을 이용해서 디렉터리를 다르게 표현할 수도 있다.
Cal.easyCal.addfile = ..easyCal.addfile
'파이썬(Python) > 파이썬(Python) 기초' 카테고리의 다른 글
파이썬(Python) 5장 추가적인 기본 사항 - 5.내장 함수 종류 몇 가지 (0) | 2022.07.11 |
---|---|
파이썬(Python) 5장 추가적인 기본 사항 - 4. 예외처리 (0) | 2022.07.08 |
파이썬(Python) 5장 추가적인 기본 사항 - 2. 모듈 (0) | 2022.07.07 |
파이썬(Python) 5장 추가적인 기본 사항 - 1. 클래스 (2) | 2022.07.06 |
파이썬(Python) 4장 입출력 - 3. 파일 생성 및 읽고 쓰기 (0) | 2022.07.05 |
댓글