Python. 모듈과 패키지 찾는 방법
1. sys.modules 와 sys.path의 차이점
모듈, 패키지를 찾는 순서
1. sys.modules
2. built-in modules
3. sys.path
1)sys.modules
은 모듈과 패키지를 찾을때 가장 먼저 확인하지만 sys.path
는 가장 마지막에 확인한다.
2)sys.modules
은 dictionary이나 sys.path
는
기본적으로 list이며 string 요소들을 가지고 있는 list 입니다.
2. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까?
sys 모듈 또한 파이썬에 내장되어 있는 모듈이기에 2번째 찾는 단계인
built-in modules
로 찾을수 있다.
3. Absolute path와 Relative path의 차이점
1)Absolute path
절대경로
import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다. -최상단 디렉토리 기준으로 한다-
가장 아래 있는 module5.py
찾는 경로는 아래 코드와 같다.
my_app.package2.subpackage1.module5.py
2)Relative path
상대경로
최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 정한다.
ex) package2의 module3
에서 package2의 class1
과 package2의 하위 package인 subpackage1의 module5의 function2
함수를 import 하려고 하면 다음 처럼 할 수 있습니다.
# package2/module3.py
from . import class1
from .subpackage1.module5 import function2
dot .은 import 가 선언되는 파일의 현재 위치를 이야기한다.
또한 .2개를 사용하는데 dot 2개 .. 는 현재위치에서 상위 디렉토리로 가는 경로를 나타낸다.
# subpackage1/module5.py
from ..module4 import class4
결론
Relative path는 경로의 길이가 짧지만 헷갈리기 쉽고 파일위치 변경 시 경로위치도 함께 변경해야 하니까
그냥Relative path
방법을 사용하자
4.calculator 패키지 만들기
4-1. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는가?
ImportError: attempted relative import with no known parent package
상대경로가 아닌 절대경로로 바꿔줌으로 써 오류를 해결할 수 있었다. 위 코드를 보면 from뒤에 dot(.)이 있음으로 상대경로인 것을 알 수 있다.
4-2.add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해보자.
절대경로로 할시 아래와 같은 에러가 발생한다.
ModuleNotFoundError: No module named 'calculator'
현재 디렉토리가 이미calculator
절대경로 상이 올바르지않은거같아서 수정하였더니 '5'라는 숫자가 잘 출력되었다.
#위에서 아래와 같이 수정하였다.
from calculator.multiplication import multiply
-----------------------------------------------
from multiplication import multiply
5. __init__.py
파일의 역할
init.py : 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
Author And Source
이 문제에 관하여(Python. 모듈과 패키지 찾는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kim-hoontae/python.-모듈과-패키지-찾는-방법저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)