Modules & Packages_1

Jina·2020년 4월 1일
0

Today I Learned

목록 보기
8/21
post-thumbnail

Module

  • 기능의 집합
  • 변수나 함수, 클래스 등을 모아놓은 파일

모듈 사용의 장점

  • 다른 파일에서 재사용 가능
  • 파일이 너무 클 때 여러 파일로 나누어서 정리 할 수 있음

Module 만들기

  1. python 파일을 만들기
  2. 그 파일 안에 사용하고 싶은 함수/ 클래스 등을 정의하기
  3. 위의 과정으로 만든 파일 --> 하나의 모듈이 됨

import

모듈을 불러오기 위해 사용하는 키워드

사용방법 : import 모듈이름

이 때 파이썬 파일의 import 모듈이름.py과 같이 사용하면 안됨

예시) module 이름 --> math / 포함된 함수 이름 --> sqrt()

import math
print (math.sqrt(9))
# 3.0

from ~ import

모듈 내에서 사용 할 몇 개의 함수/클래스/변수만 import 하기위해 사용하는 키워드

사용방법 : from 모듈이름 import 함수/클래스/변수이름1, 함수/클래스/변수이름2

from ~ import *

모듈에 있는 모든 요소가 import됨

사용방법 : from 모듈이름 import *

아래와 같이 사용

from math import *
print (sqrt(9))
# 3.0

local scope를 가지고 있는 다른 요소들과 이름 충돌이 발생할 수 있으므로 권장하지는 않음

import module vs from module import *

  • 둘 다 모듈내의 모든 요소를 사용할 수 있음
  • 차이점
    • import module은 사용시 모듈이름.함수이름으로 사용해야함 ex) math.sqrt(9)
    • from module import * 은 사용시 함수이름만 써서 사용 ex) sqrt(9)

import As

모듈또는 모듈의 요소에 새로운 이름을 주어서 사용하는 것

모듈/요소의 이름이 너무 길거나 동일한 이름의 함수가 있을시 유용함

모듈에서 사용방법 : import 모듈이름 as 바꿀이름

import my_module as m1

m1.my_module_func()

요소에서 사용방법 : from 모듈이름 import 요소이름 as 바꿀이름

from module  import my_func as f1
from module2 import my_func as f2
from module3 import function_with_name_too_long as f3

f1()
f2()
f3()

Packages

  • 파이썬 파일로 이루어져있는 directory가 하나의 package가 됨
  • directory의 이름이 곧 package의 이름이 됨

위의 이미지에서 pkg가 디렉토리 mod1, mod2가 모듈

import 패키지명.모듈명

import pkg.mod1 
from pkg.mod2 import func3

pkg.mod1.func2()
func3()

Package Initialization

패키지 안에 아래의 이미지와 같이 __init__.py 파일이 있는 경우 패키지 초기설정이 가능

패키지가 import될 때 __init__.py 파일의 코드가 자동으로 실행됨

초기설정 예시

1. import 할 때 경로 길이 줄이기

예시 ) pkg에서 mod1의 func2 라는 함수를 import 하기

  • __init__.py을 사용하지 않은 경우
# new_python_file.py
import pkg.mod1

pkg.mod1.func2()		# 함수 사용시 긴 경로를 입력해야함

위의 예시와 같이 함수를 입력할 때 긴 경로를 입력해야 함

  • __init__.py을 사용한 경우

__init__.py 파일에 아래의 내용 입력

# __init__.py
from .mod1 import func		# from .모듈 import 함수/클래스

패키지를 실행하면 위의 내용이 자동으로 실행됨

# new_python_file.py
from pkg import func2		# from 패키지 import 모듈

func2()

위의 예시와 같이 함수 사용시 경로를 줄일 수 있음


2. Package에서 import 할 수 있는 변수/함수/클래스 제한

package 외부에서 import되는 함수를 제한할 수 있음
(package의 내부에서만 사용 되어야하는 함수 등의 사용을 제한 가능)

이는 __all__ 변수를 이용하여 정의가능

__all__ 변수 default 값 : 모든 함수/ 변수/ 클래스 등
__all__ 변수를 따로 정의해주어서 import될 수 있는 요소 제한하기

예시 )

__init__.py 파일에 아래의 내용 입력

# __init__.py
from .mod1 import func2
from .mod2 import func3

__all__ = ['func2', 'func3']

패키지를 실행하면 위의 내용이 자동으로 실행됨

# new_python_file.py
from pkg import *

func2()
func3()
func4() ## <== Error. func4 함수는 __all__ 에 정의되지 않았으므로 import 될 수 없음

3. package가 import될 때 먼저 실행되어야 하는 코드 설정 등

다른 사람의 package 사용하기

다른 사람이 만든 package를 import하려면 먼저 package를 설치 해야함

사용방법 : pip

터미널에서 pip install package명


python의 import search 방식

import 모듈/패키지를 실행했을 때 python은 해당 디렉토리를 search 함

search 순서

import시 아래의 장소를 순서대로 찾음

  1. sys.modules
  2. built-in modules
  3. sys.path

sys.modules

  • 파이썬이 import하는 모듈/패키지를 찾기위해 가장 먼저 확인하는 곳
  • sys.modules는 단순한 dictionary
  • 이미 import된 모듈과 package들을 저장하고 있음
  • 새로 import 하는 모듈은 sys.modules 에서 찾을 수 없음

built-in modules

  • 파이썬에서 제공하는 파이썬 공식 라이브러리
  • 파이썬에 포함되어 나오기때문에 파이썬이 쉽게 찾을 수 있음

sys.path

  • 파이썬이 import하는 모듈/패키지를 찾기위해 마지막으로 확인하는 곳
  • string 요소들을 가지고 있는 list
    • string 요소들은 경로를 나타냄
  • list의 경로를 확인하며 해당 경로에 import할 모듈/패키지가 있는지 확인

sys module

sys는 파이썬의 built-in modules

아래과 같이 사용할 수 있음

import sys

print(sys.modules)	# dictionary로 반환
print(sys.path)		# list로 반환
  • print(sys.modules)의 결과

  • print(sys.path)의 결과

위의 세 곳에서 원하는 모듈/패키지를 찾지 못하면 ModuleNotFoundError 에러를 리턴

Absolute Path & Relative Path

Absolute Path

절대 경로 - import를 하는 파일이나 경로에 상관없이 경로가 동일
최상위 디렉토리부터 시작해 하위 디렉토리를 탐색하는 방식

단점 - 경로가 길어질 수 있음

Relative Path

상대 경로 - import 하는 위치를 기준으로 경로를 정의 (현재 작업 위치에 대한 상대 경로)
dot(.)은 파일의 현재 위치를 의미
dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로

예시)

from . import class1
from .subpackage1.module5 import function2
from ..module4 import class4

장점 - 경로의 길이를 줄여줌
단점 - 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 함

1개의 댓글

comment-user-thumbnail
2020년 4월 2일

형광펜 효과 괜찮네요

답글 달기