[TIL_Python]Modules & Packages_1

6073 단어 TILpythonTIL

Modules & Packages

파이썬에서 모듈은 변수나 함수 그리고 클래스 등을 모아놓은 파일이다.

  • 다른 파일에서 재사용이 가능하게 하고
  • 전체 코드가 한 파일에 넣기에는 너무 커졌을때 여러 파일로 나누어서 정리를 하기 위해서.

Module 만들기

-파일을 만든 후 그안에 재사용하고 싶은 함수나 클래스 혹은 변수등을 구현

## my_module.py
my_module_var = 7


def my_module_func():
    return "Hello!"


class MyModuleClass:
    pass

이렇게 하고 다른 파일에서 불러와 사용하면 된다.
import my_module
그 후 모듈의 원하는 변수/함수/클래스 사용가능
my_module.my_module_func()

다른 방법으로 모듈 import하기

from import
from my_module import my_module_func, my_module_var
from my_module import * -별표를 사용하면 해당 모든 모듈이 import된다.이렇게하면 local scope를 가지고 있는 다른 변수/함수/클래스 들과 이름 충돌이 날수 있어 권장x
from my_module import my_func as f1-새로운 이름 주기

Packages

module과 마찬가지로 다른 파일에서 불러와서 사용하는 개념인데, 차이점은 module보다 더 크고 복잡한 코드라는 점이다.
그러나 어떠한 module들은 코드의 양이 너무 커서 한 파일에 다 넣기에 비효율적일수 있다.
따라서 나눠서 코드 관리하는 것이 효율적.
Package는 파이썬 파일들로 이루어져 있는 디렉토리(directory)가 하나의 package가 된다. 그리고 디렉토리 이름이 package 이름이 된다.

Package는 일반 모듈 처럼 import 하여 사용할 수 있다.

import pkg.mod1
from pkg.mod2 import func2


pkg.mod1.func2()
func2()

Package Initialization

가끔은 package가 import 될때 초기 설정을 해줘야 할때가 있다.
파이썬은 __init__.py 파일을 통해 package 초기 설정을 가능하게 해줍니다.
Package 안에 init.py 파일이 있으면 package가 import 될때 init.py 파일의 코드들이 자동으로 실행된다.

  • Import 할때 경로의 총 길이 줄여주기
  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기
  • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

다른 사람의 package 사용하기

른 사람이 만든 package를 import 하여 사용하기 위해서는 먼저 package를 설치를 해야 한다.
pip툴을 사용한다. pip install Django


Import Search 순서

package는 단순한 파이썬 파일이거나 파이썬 파일을 담고 있는 디렉토리이다. 그러므로 해당 파일이나 디렉토리가 어디있는지 파이썬이 찾을 수 있어야 import가 가능하다.
파이썬은 3가지 장소를 순서대로 보면서 찾는다.

1. sys.modules

-단순한 딕셔너리
-이미 import된 모듈과 package들을 저장하고 있다.
-한번 import된 모듈과 패키지를 파이썬이 또 다시 찾지 않아도 되는 기능을 갖고있다.
-새로 import하는 모듈은 sys.modules 에서 찾을 수 없습니다.

2. built-in modules

-파이썬에서 제공하는 파이썬 공식 라이브러리들
-이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있다.

3. sys.path

-기본적으로 list이며 string요소들을 가지고 있다.
-그러므로 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인한다.
-sys 는 파이썬에 포함되어 있는 모듈입니다. 그러므로 다음 처럼 sys 모듈을 import 해서 sys.modules와 sys.path 를 출력할수도 있고 수정 할 수 도 있습니다.
-string요소들은 다음처럼 경로를 나타낸다.

['',
 '/Users/song-eun-u/anaconda3/bin',
 '/Users/song-eun-u/anaconda3/lib/python36.zip',
 '/Users/song-eun-u/anaconda3/lib/python3.6',
 '/Users/song-eun-u/anaconda3/lib/python3.6/lib-dynload',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/aeosa',
 '/Users/song-eun-u/anaconda3/lib/python3.6/site-packages/IPython/extensions',
 '/Users/song-eun-u/.ipython']

정리를 하자면, 파이썬은 import 하고자 하는 모듈과 package를 찾을때에 먼저 sys.modules를 보고, 없으면 파이썬 built-in 모듈들을 확인 하고 마지막으로 sys.path에 지정되어 있는 경로들을 확인해서 찾는다.
sys.path 에서도 못찾으면 ModuleNotFoundError 에러를 리턴한다.


Absolute Path & Relative Path

-built-in 모듈과 pip로 설치한 모듈은 자동으로 site-packages라는 디렉토리에 설치가 되는데, 이미 sys.path에 포함되어있기 때문에 문제가 없다.
-하지만 직접 개발한 local package를 import할때는 해당 패키지의 위치에 맞게 import경로를 잘 선언해야 한다.
-Local package를 import 하는 경로에는 absolute path relative path 가 있습니다.

1. absolute path

절대 경로 , import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py
        └── subpackage1
            └── module5.py

my_app 이라는 프로젝트 이며 package1과 package2 라는 2개의 package를 가지고 있다.
그리고 package2는 subpackage1 라는 중첩 package를 가지고 있다.
Absolute path를 사용해 package1 과 package2를 import 하면 다음과 같다.

from package1 import module1
from package1.module2 import function1
from package2 import class1
from package2.subpackage1.module5 import function2

subpackage1의 module5 모듈의 function2 함수를 import 하기 위해서는 다음 경로를 거치게 된다.

my_app => package2 => subpackage1 => module5.py

✏️리눅스의 디렉토리 경로 형식
my_app/package2/subpackage1/module5.py
✏️윈도우 형식
my_app\package2\subpackage1\module5.py
✏️파이썬에서는 slash (/) 나 back slack() 대신에 dot (.) 을 사용해서 경로 표현
package2.subpackage1.module5.py
->my_app은 이미 프로젝트 안에 있으므로 생략

my_app 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하게 되므로 absolute path 라고 하는 것이다.
단점: 경로가 길어질 수 있다는 점 !!

2. relative path

-absolute path의 단점을 보안하기 위해 사용된다.
-Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의한다. 그래서 일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용된다.

예를 들어, package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 하면 다음 처럼 할 수 있다.

# package2/module3.py    *현재위치 *

from . import class1
from .subpackage1.module5 import function2

여기서 dot(.)은 import가 선언되는 파일의 현재 위치를 이야기한다.
dot 2개(..) 는 현재위치에서 상위 디렉토리로 가는 경로이다.

# subpackage1/module5.py
from ..module4 import class4

Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있다. 그러므로 웬만한 경우 absolute path를 사용하는게 권장 된다.


좋은 웹페이지 즐겨찾기