# 25. TIL module

이지훈·2021년 6월 11일
0

TIL

목록 보기
25/33
post-thumbnail

1.

sys.modules 와 sys.path의 차이점을 서술해 주세요.

  • modules :
    - 각종 변수, 함수, 클래스를 담고 있는 파일
  • package : 특정 기능과 관련된 여러 모듈(module)을 묶은 것이며 module에 네임스페이스(namespace, 이름공간)를 제공합니다.
  • sys.modules

    • 파이썬이 파일을 불러올 때 모듈이나 패키지를 먼저 검색합니다.

    • 딕셔너리 구조

    • import 되어있는 모듈과 패키지를 저장하며 다시 찾지 않아도 되는 특징이 있다.

  • sys.path

    • 모듈과 패키지 검사 후 sys.path를 찾습니다.

    • 리스트 구조이며(string 요소를 가짐)

    • 리스트 요소 처음부터 끝까지 찾습니다.

    • 파이썬에 포함되어 있는 내장 함수입니다.

    • 만약 모듈을 찾지 못한다면 ModuleNotFoundError가 반환됩니다.


2.

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

import문을 만나면 파이썬은 다음과 같은 순서로 모듈 파일을 찾아 나섭니다.

  • 파이썬 인터프리터 내장 모듈

  • sys.path에 정의되어있는 디렉토리

sys모듈은 내장모듈이기 때문에 확장자가 py인 형태로는 찾을 수 없습니다.
C언어로 프로그래밍되어 파이썬에 내장되어있습니다.

import sys
print(sys.builtin_module_names)

이 소스코드로 내장모듈 목록을 볼 수 있습니다.

여기에 없다면 sys.path에 정의되어있는 디렉토리에서 모듈파일을 탐색하기 시작합니다.


이를 디렉토리는 아래와 같습니다.

  • 파이썬 모듈이 실행되고 있는 현재 디렉토리

  • PYTHONPATH 환경변수에 정의되어있는 디렉토리

  • 파이썬과 함께 설치된 기본 라이브러리


이것을 알아보는 소스코드는 아래와 같습니다.

import sys
for path in sys.path
print(path)

3.

Absolute path와 relative path의 차이점을 서술해 주세요.

파이썬의 built-in modulespip로 설처한 라이브러리들은 파이썬이 경로를 찾는데 문제가 없기 때문에 mport하는데에 있어 문제가 발생하지 않는다. (설치한 라이브러리들은 sys.path가 포함하고 있는 site-packages에 저장되기 때문에 파이썬이 쉽게 찾는다.) 하지만 경로에 대해서 이해하고 넘어가야하는 이유는 직접 개발한 local package때문이다. 직접 개발한 local package는 파이썬에서 경로를 검색할 수 있도록 직접 지정해주어야하는데 여기서 알아야하는 개념이 바로 경로에 대한 개념이다.

이러한 경로 표현 방식은 OS에 따라 다르게 표현된다.

리눅스
my_app/package2/subpackage1/module5.py

윈도우
my_app\package2\subpackage1\module5.py

파이썬
my_app.package2.subpackage1.module5.py

Absolute Path(절대경로)는 어느 위치에서 import를 하던 경로가 항상 동일하다. 일반적으로 보통 절대 경로를 사용하지만 절대 경로를 사용한다면 경로가 길어질 수 있다는 단점이 존재한다. 그래서 이러한 단점을 보완하기 위해서 사용되는것이 Relative Path(상대경로)이다.

절대경로는 프로젝트 폴더 최상위(root)기준으로 경로가 표시되며,
절대경로는 최상위루트부터 경로를 표시해야해서 경로를 길게 표시해야하는 단점이 있다.

상대 경로는 절대 경로와는 다르게 현재 위치를 기준으로 하여 경로를 정의한다. 때문에 일반적으로 상대 경로는 local package 에서 다른 local package를 import할 때 주로 사용된다.

상대경로의 단점은 파일의 위치가 변경되었을 때, 찾을 수 없다는 점이 있다.

  • / : 루트위치
  • ./ : dot 하나는 현재폴더 위치
  • ../ : dot 두개는 현재위치에서 상위 디렉토리로 가는 경로.

4.

main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야힐끼요?

ImportError: attempted relative import with no known parent package

위와 같은 error가 나온다. 그 이유는 아래와 같다.

상대 경로 import는 현재 모듈의 이름을 기반으로합니다. 기본 모듈의 이름은 항상 __main__이므로 Python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대경로를 사용해야합니다.


5.

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

상대경로는 현재 모듈의 이름을 기반으로 생섭됩니다.
하지만 기본적으로 생성되는 모듈의 이름은 __main__ 이므로 python 응용 프로그램의 기본 모듈로 사용하려는 모듈은 항상 절대경로를 사용해서 불러올 수 밖에 없습니다.

즉, __main__모듈을 기본 모듈로 사용하기 위해서는 상대경로를 사용해서는 프로그램을 돌릴 수 없습니다.


6.

init.py 파일의 역할

__init__.py 파일은 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 합니다.

python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식이 됩니다. 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하면 좋습니다.


출처

내장목록 검사 방법
정대경로 상대경로 참고1
절대경로 상대경로 참고2
init.py 의 용도

profile
꾸준하게 🐌

0개의 댓글