파이썬(Python)/파이썬(Python) 기초

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

인생즐겜러 2022. 7. 8. 18:21
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
반응형