Python - [Package]

이주명·2021년 11월 7일
0
post-custom-banner

sys.modules 와 sys.path 의 차이점에 대하여 설명하세요

두 속성의 차이점은 import의 유무이다.

sys.modules

파이썬이 모듈이나 package를 찾기위해 가장 먼저 확인하는 곳.
sys.modules는 이미 import 된 package나 모듈을 저장한다.
이는 dictionary 형태로 결과값을 돌려주며 key에 모듈 이름이 들어간다. 여기서 key값에 모듈이름이 없다면 다음 확인 저장소인 built-in-modules를 확인한다.

sys.path

sys.path는 아직 import 되지 않은 모듈이나 package의 절대경로를 저장한다.
만약 내가 만든 모듈이나 패키지를 사용하고 싶다면 sys.path에 그 경로를 추가한 후 import를 할 수 있다.

sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

sys 모듈은 파이썬에 내장되어 있는 모듈이다. 이로써 built-in modules를 통해 쉽게 찾아낼수 있다.

built_in_modules

파이썬에서 제공하는 파이썬 공식 라이브러리들이다.

Built-in 모듈들은 이미 파이썬에 포함되어 나오므로 파이썬이 쉽게 찾을 수 있다.

3. Absolute pathrelative path의 차이점을 서술해 주세요.

Absolute path는 절대경로, relative path는 상대경로를 뜻한다.

절대 경로

절대 경로는 current directory 로부터 시작한다.
current directory 란 현재 프로젝트의 디렉토리를 뜻 한다.

간단하게 설명하자면 절대 경로는 모듈이나 package를 import 할 때 모든 파일 경로를 써주면 된다.(current directory 제외)

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

여기서 current directory는 my_app때문에 제외된다.

from package1 import module1
from package1.module2 import function1

상대 경로

상대 경로란 import 하는 위치를 기준으로 경로를 정의한다.
현재 위치가 package2에 module3에 있다면 다음과 같이 상대 경로를 사용하여 import 할 수 있다.

# package2/module3.py

from . import class1
from .subpackage1.module5 import function2

여기서 .(dot)이 의미하는 것은 현재 디렉토리를 의미하고
..(dot2개)는 상위 디렉토리로 간다는 것을 의미한다.

Calculator 패키지 만들기

  • main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러는?

상대 경로를 이용할시 현재 디렉토리의 name을 경로에 포함시켜 calculator로 시작되어야하는 경로를 읽어내지 못한다.

따라서 절대 경로인

from calculator.add_and_multiply import add_and_multiply 

를 사용해서 import 해줘야한다.

!! 메인 모듈의 이름은 항상 "__main__" 이기 때문에, 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 한다.

  • add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점은?

상대 경로 사용시


상대 경로 사용시 경로앞에 "__main__"이 되므로 경로를 읽어 올수 없다.

절대 경로 사용시

여기서 사용한 절대경로는

**calculator => calculator => multiplication => multiply**

라는 뜻이 된다.

mutipication 과 add_and_multiply의 파일은 같은 calculator 디렉토리에 위치해 있기 때문에 절대 경로 이용시 앞에 calculator을 붙여줄 필요가 없다.

해결

from multiplication import multiply

__init__.py의 역할

__init__.py 파일이 있으면 package가 import 될때 __init__.py 파일의 코드들이 자동으로 실행됩니다.

일반적으로 다음 사항들을 할 수 있습니다.

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

0개의 댓글