[python 기초] module/package, import search (1)

EMMA·2022년 3월 6일
0
post-thumbnail

모듈과 패키지, 그리고 파이썬의 import 방법


module(모듈)과 package(패키지)의 정의는 각각 아래와 같다.

  • module: 변수,함수,클래스 등을 모아놓은 파이썬 파일 (다른 사람이 만든 모듈 사용 가능)
  • package: 여러 module의 집합, 하나의 directory와 같은 역할

module/package가 왜 필요할까 생각해보면,
일단 코드의 양이 방대할테니 정리 및 분류를 할 필요가 있었을 것이다.
(모든 내용을 하나의 파일에 다 넣을 수는 없을 것이고, 반복되는 클래스나 함수 등도 있을테니)
그리고 잘 정리해놓으면, 그때그때 재사용도 쉬워지니 잘 활용하는게 필요하겠다.


#️⃣ import와 namespace
module을 만들어놓고, main 파일에서 module을 사용하려면 import를 사용해야 한다. mod1.py을 사용하려고 하면, 확장자를 제외하고 작성하면 된다.

import mod1		#mod1.py 불러옴 

세부적인 내용(클래스,함수 등)은 그 뒤에 붙이면 된다.
namespace 구조에 따라, 모듈명을 먼저 붙여줘야 파이썬은 해당 함수를 찾을 수 있다.

import mod1.my_func		#mod1.py에 있는 my_func함수 불러옴 

module을 부를 때, 해당 module 속 일부만 호출할 수도 있다.
from...import 를 사용해서 특정 변수/함수/클래스를 호출하는 것이다.

from mod1 import my_func		#mod1.py의 my_func함수 불러옴 
from mod1 import * 				#mod1.py의 모든 내용 불러옴 

외부의 module들을 호출하다 보면, 서로 충돌이 일어날 수 있다.
이러한 경우 불러들인 모듈이나 특정 내용에 다시 이름을 붙일 수 있다.

import mod1 as m1			
from mod1 import my_func as f1
from mod1 import function_with_name_too_long as f2

#️⃣ package
package는 module의 집합체다.
여러 module에 분산되어 있는 코드도 하나의 package로 불러와 사용할 수 있다.

import pkg.mod1		#pkg에 있는 mod1.py 불러옴 
from pkg.mod1 import my_func

그리고, package 안에 __init__.py 이 있고 초기 설정이 되어 있을 경우, import될 때 자동으로 실행된다. 초기 설정이란,

  • 해당 디렉토리가 package임을 알려줌
  • import할 수 있는 변수/함수/클래스를 제한하는 것
  • 그 외 package가 import될 때 먼저 실행해야 하는 코드들 설정

초기 설정을 통해, import 가능한 내용을 제한하고 경로의 길이를 줄일 수 있다.

#__init__.py
from .mod1 import my_func
from .mod2 import my_func_new
__all__ = ['my_func','my_func_new']

위와 같이 __init__.py에 설정하면, 내가 import할 수 있는 함수는
my_funcmy_func_new 뿐이다. 다른 내용은 정의되지 않았으므로 import할 수 없다.

그리고 아래 내용을 보면 __init__.py이 경로 길이를 어떻게 줄이는지 알 수 있다.

#__init__.py
from .mod1 import my_func

#main.py (내가 작성할 main 파일)
from pkg import my_func		
#from pkg.mod1 import my_func

module 처럼 다른 사람이 만든 package도 가져올 수 있다. 이 때 pip라는 명령어를 사용한다.

pip install Django

pip로 설치한 외부 module은 directory 중 site-package에 저장되며, 이는 다시 sys.path에 포함된다.

profile
예비 개발자의 기술 블로그 | explore, explore and explore

0개의 댓글