Language/Python

19. python - package

Jongsung 2019. 12. 27. 23:17

python 패키지에 대해 알아보겠습니다.

python은 패키지로 분된 개적인 모듈로 구성되어 있습니다.

쉽게 다시 설명드리면 패키지는 앞선 포스팅에서 다뤘던 모듈을 모아놓은 폴더라고 정의 내릴수 있습니다.

 

1. 패키지 만들기

sub > sub1 폴더를 생성하여 폴더안에 mod_1 모듈을 생성하겠습니다.

def test1():
    print('hello test1')

def test2():
    print('hello test2')

 

위와 같은 방법으로 sub > sub2 폴더에 mod_2 모듈을 생성하겠습니다.

def test3():
    print('hello test3')

def test4():
    print('hello test4')

 

2. 패키지 안의 함수 실행하기

패키지 안의 함수를 실행하기 위해서는 모듈을 import 해야 합니다.

import 하는 방법은 토트(.)를 이용하며 예를 들면 sub.sub1.mod_1 인 경우에 sub는 패키지의 이름이 되고 mod_1dms A의 모듈이 됩니다.

import sub.sub1.mod_1
import sub.sub2.mod_2

# 사용
sub.sub1.mod_1.test1()
sub.sub1.mod_1.test2()
sub.sub2.mod_2.test3()
sub.sub2.mod_2.test4()

>> result
hello test1
hello test2
hello test3
hello test4

위와 같이 test1 ~ test4의 print문이 출력되는 것을 볼 수 있습니다.

 

3. from 절 사용하기

from 절은 쉽게 설명드리면 import 할때 어디서부터 가져올것인지 정해주는 것입니다.

from sub.sub1 import mod_1
from sub.sub2 import mod_2 as t2

위의 import 방법을 설명드리자면 sub의 sub1 패키지로부터 mod_1을 가져오겠다라는 뜻입니다.

또한 import mod__2 as t2에서 as는 alias로 mod_2의 별병을 만들어 주는 것입니다.

예제를 살펴보겠습니다.

from sub.sub1 import mod_1
from sub.sub2 import mod_2 as t2 #alias 별명을 주는것

mod_1.test1()
mod_1.test2()

t2.test3()
t2.test3()

>> result
hello test1
hello test2
hello test3
hello test3

  

4. 모든 모듈을 import 하기

위에 예시들 처럼 하나의 모듈을 import 하는 것이 아닌 패키지 안에 있는 모든 모듈을 import 할때에는 * 를 사용합니다.

바로 예제를 확인해보겠습니다.

from sub.sub1 import * 
from sub.sub2 import *

mod_1.test1()
mod_1.test2()
mod_2.test3()
mod_2.test4()

>> result
NameError: name 'mod_1' is not defined

sub.sub1 의 패키지에 있는 모든것을 import 하였는데 실행을 하면 에러가 발생하는 것을 볼수 있습니다.

특정 디렉터리의 모듈을 *를 사용하여 import할 때에는 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 합니다.

즉 sub > sub1 밑에 __init__.py 를 생성하여 아래와 같이 모듈을 정의해 주면 됩니다.

__all__ = ['mod_1']

위와 같은 방법을 sub2 밑에도 동일하게 정의해 주면 됩니다.

그후 __init__.py를 정의한 후 다시 코드를 실행시키면 정상적으로 결과가 출력되는 것을 볼수 있습니다.

from sub.sub1 import *
from sub.sub2 import *

mod_1.test1()
mod_1.test2()
mod_2.test3()
mod_2.test4()

>> result
hello test1
hello test2
hello test3
hello test4