[TIL] 모듈과 패키지

양희연·2020년 6월 1일
0

Python

목록 보기
6/10
post-thumbnail

코드를 작성하고 있는데 다른 파일에 있는 코드를 쓰고 싶을 때 어떻게 해야 할까? 🤔

파이썬에서는 모듈과 패키지를 import 해서 사용할 수 있다.



📄 모듈

변수나 함수 그리고 클래스 등을 모아 놓은 파일이다. *.py

#my_module.py
x = 10

def my_module_func():
    print('hello')

import 모듈이름
<모듈이름>.<모듈에서 사용하길 원하는 변수/함수/클래스 이름>

import my_module

print(my_module.x)                 #10
my_module.my_module_func()         #hello

#as로 모듈이름을 줄여서 사용할 수 있다.
import my_module as m
print(m.x)
m.my_module_func()

from 모듈이름 import 변수/함수/클래스

from my_module import x, my_module_func

print(x)                           #10
my_module_func()                   #hello



🗂 패키지

파이썬 파일들로 이루어져 있는 디렉토리가 하나의 패키지가 된다.
그리고 그 디렉토리 이름이 패키지 이름이다.

#import 디렉토리명.파일명
import package.module1

#from 디렉토리명.파일명 import 변수/함수/클래스명
from package.module2 import func2

package.module1.func1()
func2()

패키지 내 __init__의 역할
__init__.py 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
파이썬 3.3 버전부터는 없어도 패키지로 인식한다. 하지만 하위 버전 호환을 위해 파일을 생성하는게 안전한 방법이다.
package가 import 될 때 __init__.py 의 코드들이 자동으로 실행된다.

① import 할 때 경로의 총 길이 줄여주기
패키지 디렉토리 내에 module1.py를 import 할 때 위의 예시처럼 하면 코드가 너무 길어지기 때문에 __init__.py를 이용한다.

#__init__.py
from .module1 import func1

#main.py
from package import func1

func1()

② 패키지에서 import 할 수 있는 변수/함수/클래스 제한하기
*를 이용하여 import 할 경우 __init__.py 파일 내 __all__ 변수에 저장된 모듈만 사용가능하다.

#__init__.py
from .module1 import *
__all__ = ['func1', 'x']


#main.py
from package import *

func1()
print(x)
print(y)               #error, y는 module1 파일에 존재하는 변수

③ 그 외 패키지가 import 될 때 꼭 먼저 실행되어야 하는 코드들



🚗 파이썬이 import 하는 순서

sys.modules → built-in modules → sys.path
sys.path 에서도 못 찾으면 ModuleNotFoundError 를 리턴한다.

  • sys.modules: 딕셔너리 형태, 이미 import 된 모듈과 패키지들을 저장하고 있다.
  • built-in modules: 파이썬에서 제공하는 파이썬 공식 라이브러리들
  • sys.path: string 요소들을 가지고 있는 list. 각 요소는 경로를 나타낸다.

sys는 파이썬에 포함되어 있는 모듈이다.(built-in modules)

따라서 sys를 import 해서 sys.modules와 sys.path 를 출력할 수 있다.

import sys

print(sys.modules)
print(sys.path)



🛣 절대경로와 상대경로

#절대경로
#main.py에서 module1 import
from package.module1 import x

print(x)



#상대경로
#module1.py 에서 module2 import
from .module2 import module2_x
y = module2_x + 100


#main.py 에서 module1 import
from package.module1 import y
print(y)

💡 Note that relative imports are based on the name of the current module. Since the name of the main module is always __main__, modules intended for use as the main module of a Python application must always use absolute imports.

❗️해당 모듈이 직접 실행되는 경우에는 __name____main__ 으로 설정된다. ❗️

위 상대경로 마지막 예제에서 main.py의 __name____main__, module1의 __name__package.module1 이다.
👉 따라서 main 파일에서는 절대경로를 써야 하고 module1 파일에서는 상대경로를 써도 무방하다.

💡 __name__

현재 모듈의 이름을 담고 있는 내장변수로, print(__name__) 으로 값을 알 수 있다.



참고자료: https://docs.python.org/3/tutorial/modules.html#intra-package-references

profile
꾸준히 나아가자!

0개의 댓글