본문 바로가기
파이썬(Python)/파이썬(Python) 기초

파이썬(Python) 5장 추가적인 기본 사항 - 3. 패키지

by 인생즐겜러 2022. 7. 8.
728x90
반응형

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

728x90
반응형

댓글