[Python] 상대경로와 절대경로

mean_g·2022년 7월 5일
0

[ Python & Django ]

목록 보기
2/10

1. sys.modulessys.path의 차이점은 무엇일까?

1) sys.modules

  • 파이썬에서 모듈이나 package를 찾기 위해 가장 먼저 확인하는 곳이다.
  • 단순한 dictionary로, 이미 import된 모듈과 package들을 저장하고 있다.(= 한 번 import된 모듈과 package들은 파이썬이 다시 찾지 않아도 되도록 한다.)
  • 새로 import 한 모듈은 sys.modules에서 찾을 수 없다.

2) sys.path

  • 파이썬에서 모듈이나 package를 찾기 위해 마지막에 확인하는 곳.
  • list 형태로 string 요소들을 가지고 있다.
  • 각 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']
  • 파이썬은 list의 각 경로를 하나하나 확인하면서 해당 경로에 import 하고자 하는 package가 위치해 있는지 확인한다.

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

1) sys는 파이썬에 포함된 모듈이다. 그러므로 sys 모듈을 import 해서 sys.modulesys.path를 출력, 수정할 수 있다.

import sys
print(sys.path)
print(sys.modules)

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

3) sys.path에서도 못 찾으면 ModuleNotFoundError 에러를 리턴한다.

3. Absolute path와 relative path의 차이점은 무엇일까?

1) Absolute path :

  • 절대경로 ( import 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.)
  • 경로가 길어질 수 있는 단점이 있다 (->이러한 단점 보완을 위해 relative path를 사용한다.)

2) Relative path :

  • import 하는 위치를 기준으로 경로를 정의한다.
  • 주로 local package 안에서 다른 local package로 import 할 때 사용된다.
  • 헷갈리기 쉽고, 파일 위치가 변경되면 경로 위치도 변경되어야 한다. (->absolute path를 사용하길 권장한다.)

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

우선 calculator 패키지를 만들고 main.py에서 add_andmutiply를 임포트 하면 해당 에러가 발생한다.

상위 패키지를 알 수 없는 상대를 가져오려는 시도를 했다고 한다.

공식 문서를 보면 아래와 같은 문구가 있다.

< Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports. >

main 모듈은 항상__main__이고, 메인 모듈에서는 항상 절대경로를 사용해야 한다고 한다.

절대경로로 바꿔서 돌려보면 정상적으로 출력되는 걸 확인할 수 있다.

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

add_and_multiply.py는 패키지 안에 있는 모듈이라서 절대경로와 상대경로가 모두 정상적으로 출력된다.
하지만 main.py는 패키지 안에 속하지 않았으므로 상대경로는 실행이 안 되며 절대경로만 실행할 수 있다.

6. __init__.py 파일의 역할은?

__init__.py 는 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다.
python3.3 이전 버전은 패키지에 포함된 디렉터리에 __init__.py 파일이 없다면 패키지로 인식을 하지 않는다고 한다.
(python3.3이후로는 없어도 패키지로 인식한다_PEP420)

profile
Backend Dev

0개의 댓글