15. TIL (Module, Path)
조금은 어려운 개념인 Module과 path에 대해 알아보자아!
1. Module & Packages
: 변수나 함수, 클래스 등을 모아놓은 파일.
- 모듈을 사용하는 이유? : 다른 파일에서 재사용하기 위해
전체 코드가 한 파일에 넣기에는 너무 커져서 여러 파일로 나누어 정리를 하기 위해 - 모듈을 불러오는 방법 :
import < 모듈 이름>
파일 확장자인 .py 제외하고 파일 이름만 사용하여 import 해야함! - 모듈의 형식 : namespace 구조
모듈의 이름을 앞에 붙여주어야 파이썬이 어느 파일을 봐야 해당 함수를 찾을 수 있는지 알 수 있다.<모듈 이름>, <모듈에서 사용하길 원하는 변수/ 함수 / 클래스 이름> my_module.my_module_func() : my_module의 my_module_func 함수를 호출
- import keyword 이외
from ... import... keyword
를 사용해 모듈을 불러올 수 있다.
모듈에서 사용하는 것이 명확할 때 사용하면 편리하며,
모듈 이름을 붙이지 않고 곧바로 원하는 함수, 변수, 클래스를 호출할 수 있다.
*
을 사용하면 모듈의 모든 요소가 import 되지만,
local scope를 가지고 있는 다른 변수/함수/클래스들과
이름 충돌이 날 경우 알기 어렵기에 권장하지 않는 방법.
- 여러모듈을 import 하는 경우 ? :
import as
키워드로 새로운 이름을 준다!
ex) my_module 에서 my_module_func 함수와 my_module_var 변수를 import 한다면?
ex) import as 사용하기from my_module import my_module_func, my_module_var print(my_module_var) my_module_func() from my_module import * : 한 줄로 표현하면 깔-끔
from my_module import My_func as f1 from my_module2 import My_func as f2 from my_module3 import function_with_name_long as f3 import my_module as m1 m1.my_module_func()
2. Packages
-
모듈과 마찬가지로 다른 파일에서 불러와 사용하는 개념이지만 모듈보다 크고 복잡한 코드!
-
여러 파일에 나누어져있는 코드들도 하나의 모듈로 불러와 사용할 수 있게 해주는 것이 패키지.
-
Package는 파이썬 파일들로 이루어져있는 디렉토리가 하나의 Package가 되며, 디렉토리의 이름이 Package의 이름이다!
-
사용 시, import로 불러오며, 클래스 객체를 사용할 때 처럼 원하는 모듈을 import 해야한다!
import pkg.mod1 from pkg.mod2 import func2 pkg.mod1.func2() func2()
-
초기 설정이 필요할 때
__init__.py
파일을 통해 가능.
: Package 안에 init.py 파일이 있으면 package import 시 코드들이 자동으로 실행됨 -
__init__.py
파일의 역할 :- Import 시, 경로의 총 길이 줄여줌
ex) mod1의 func2를 import# __init__.py from .mod1 import func2 .# main.py from pkg import func2 func2()
- Import 시, 경로의 총 길이 줄여줌
-
Package에서 Import 할 수 있는 변수/함수/클래스 제한
: 함수가 패키지 내부에서 import 되어 사용되는 것을 막기 위해__all__.py
변수 지정 가능
__all__.py
변수의 defalut 값은 모든 함수/ 변수 / 클래스.
그렇기에 변수를 따로 정의해 import 될 수 있는 요소를 제한할 수 있으며,
__all__.py
변수는 string 값의 요소를 가지고 있는 list!
import 되길 원하는 요소를 string으로 list에 선언해주면 된다.
ex).#__init__.py from .mod1 import func2 from .mod2 import func3 __all__ = ['func2' , 'func3' ] .#main.py from pkg import + func2() func3()
3. 파이썬은 모듈과 패키지를 어떻게 보고 찾는가!?
- 3가지의 장소를 순서대로 보면서 찾는다!
sys.modules -> bulit-in-modules -> sys.path
3-1. sys.modules
- 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳
- sys.modules은 dictionary로 이미 import된 모듈과 패키지들을 저장해둠
- 한 번 import된 모듈과 패키지는 다시 찾지 않아도 되는 기능이 있지만,
새로 import 하는 module은 sys.modules에서 찾을 수 없다. 3-2. bulit-in-modules - 파이썬에서 제공하는 공식 라이브러리들. 이미 파이썬에 포함되어 나옴
3-3. sys.path
- 모듈과 패키지를 찾기 위해 가장 마지막으로 보는 장소.
- 기본적으로 list이며 string 요소들을 가지고 있음!
- 파이썬은 리스트의 각 경로를 하나하나 확인하며 해당 경로에 import 하고자 하는 패키지가 위치해 있는지 확인한다!
- sys.modules과 sys.path를 출력 / 수정할 수 있음
3-4. Absolute path와 relative path
- 절대경로와 상대경로. (자세한 설명은 하단 차이점에서 -! )
ex) 프로젝트 예시
-
Absolute path를 사용해 package1과 package2를 import하면?
-
Absolute path 경로 표현하기
my_app => package2 => subpackage1 => module5.py my_app/package2/subpackage1/module5.py : 리눅스의 directory 경로 형식 my_app\package2\subpackage1\module5\.py : 윈도우 형식 my_app.package2.subpackage1.module5.py : 파이썬의 경로 표현 방식 (my_app)은 이미 프로젝트 안에 있으므로 생략 가능
-
파이썬의 경로를 from import keyword를 사용해 import 하게 되면?
from package2.subpackage1.module5 import fucntion2
-
Relative path 예시
ex) package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import 하려고 한다면?
-
. dot
은 import가 선언되는 파일의 현재 위치를 가르킴.
현재 위치에서부터 원하는 모듈의 경로만 선언해주면 됨!
.. dot
2개도 사용이 가능함 => 상위 디렉토리로 가는 경로로 사용됨
Assignment
1. sys.modules
와 sys.path
의 차이점을 서술해 주세요.
:
- import 하고자 하는 모듈과 package를 찾을 때 먼저
sys.modules
을 보고,
없다면 bulit-in 모듈을 확인하고, 마지막으로sys.path
에 지정되어 있는 경로들을 확인해서 찾는다! 못찾으면ModuleNotFoundError
를 리턴함 - sys.path: pip를 통해 설치한 외부 모듈은 자동으로 site-packages라는 디렉토리에 설치되고, 이 내용이 sys.path에 포함
2. sys
도 import
해야하는 모듈입니다. 파이썬은 sys
모듈의 위치를 어떻게 찾을 수 있을까요?
: list의 경로를 하나하나 확인하며 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인하며 찾아낸다!
3. Absolute path와 relative path의 차이점을 서술해 주세요.
- Absolute path : 절대경로. import 하는 파일이나 경로에 상관없이 항상 경로가 동일함.
모든 경로의 시작점이 가장 최상위 디렉토리. 일반적인 Local package를 import 할 때 사용하면 됨
경로가 길어질 수 있다는 단점이 있음
- Relative path : import 하는 위치를 기준으로 경로를 정의함. 일반적으로 relative path는 local package에서 다른 local package를 import 할 때 사용됨. 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 한다는 단점이 있음
calculator
패키지 만들기 => 추후 포스팅 진행 예정!
Author And Source
이 문제에 관하여(15. TIL (Module, Path)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@damdreammm/15.-TIL-Module-Path저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)