TIL - 25 python

이동근·2021년 1월 15일
0

python

목록 보기
11/18
post-thumbnail

드디어 마지막......check point에 도달 했다................

1. sys.path와 sys.modules의 차이는?

1-1. sys?

우선 sys에 대해서 알아보려고 한다. sys는 python 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.

1-2 sys.module?

python이 import할 module이나 package를 찾을 때 가장 먼저 확인하는 장소이다. 이 모듈은 단순한 dictionary 형태로 이루어져 있으며, 가장 중요한 점은 이미 import된 module과 package들이 저장되어 있는 장소이다. 즉 한 번 import된 module 과 package들은 python이 다시 찾지 않도록 하는 기능을 가지고 있습니다. 그래서 새롭게 import 된 module, package들은 여기서 찾을 수 없습니다.

1-3 sys.path?

python이 import할 module 과 package를 찾을때 sys.module, buil-in modules 그 다음 마지막으로 찾는 장소이다. path가 경로, 길이라는 의미를 가지고 있듯이 파이썬 모듈들이 저장되어 있는 위치를 list의 형식으로 구성되어져 있다. 즉 이 위치에 있는 python 모듈은 경로에 상관없이 어디에서나 불러올 수 있다.

1-4 sys.module와 sys.path의 차이는?

sys.module

  • dctionary형태
  • 새롭게 추가된 모듈 혹은 패키지들을 찾을 수 없다.
  • 파이썬이 모듈 혹은 패키지를 찾을 때 가장 처음 찾는 장소

sys.path

  • list 형태
  • pip을 통해 추가된 모듈이나 패키지들은 sys.path.append('경로')를 등록해줌 으로서 사용이 가능하다.
  • 파이썬이 모듈 혹은 패키지를 찾을 때 마지막으로 찾는 장소


    첫 줄이 dicrionary 형식으로 되있는 sys.modules 이고 두 번째 줄이 list형식으로 되어 있는 sys.path이다.

2. sys역시 import 해야하는 모듈인데 파이썬은 sys모듈의 위치를 어떻게 찾을까?

sys모듈역시 파이썬에 내장된 built-in 모듈 중 하나이므로 경로 검색 순서에 따라 쉽게 찾을 수 있다.

위에 sys.module 보게 되면 sys의 경로는 bulit-in되어있다. 즉 내장된 모듈 중 한개 이다.

3.absolute path와 relative path의 차이점은?

3-1 절대경로(absolute path)

최상위 디렉토리를 통해 탐색하는 방식이다. 기준이 정해져 있기 때문에 같은 모듈이나 함수를 import한다면 현재 작업하는 파일의 위치가 어디든 상관없이 모듈을 소환하는 경로가 같다. 전체적인 경로를 나타내기 때문에 정확하지만, 경로명이 길어진다는 단점이 있다.

3-2 상대경로(relative path)

import하는 위치를 기준으로 경로를 정의한다. 그래서 일반적으로 상대경로는 local package 안에서 다른 local package를 import할 때 사용됩니다.
예를 들어

  1. 동일선상의 경로
    package2의 module3에서 package2의 class1과 package2의 하위 package인 subpackage1의 module5의 function2 함수를 import하려고 한다면

    여기서 dot(.)은 import 선언되는 파일의 현재 위치를 이야기 합니다.

  2. 상위폴더의 경로

여기서 dot의 두개는 현재에서 상위 디렉토리로 가는 경로이다.

3-3 절대경로 vs 상대경로

두 개 다 각각의 장점과 단점이 있지만, 상대경로는 경로의 길이를 줄여준다는 장점은 있지만 파일 위치가 변경된다면 경로 위치도 변경되어야 한다는 단점이 있다. 반면 절대경로는 경로 하나하나 다 적어줘야 해서 경로의 길이가 길지만, 정확하다. 그래서 왠만하면 절대경로를 사용하는 편을 추천한다.

4. caculator 패키지 만들기


pychram으로 caculator를 만들었다.


add_multiply


main.py


multiply.py

결과!!

..................?????????????????

5. 오류 해결하기

찾아보니 상대경로 import를 할 경우 현재 module의 이름을 기반으로 하기때문이다. 만약 모듈을 해당 모듈이 작성된 스크립트 안에서 실행 한다면 name == 'main'이다. 그러나 다른 모듈에서 import를 할 경우에는 main이 아닌 모듈 명이 출력이 됩니다.

즉 caculator 파일 구조에서는 main은 패키지에 속한 파일이 아니기때문에 main.py이 속한 모듈의 이름은 main이 됩니다.

즉 해결방법은 절대경로를 통해서 해주면 해결이 된다.

절대경로로 변경

결과값

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

절대 경로로 import 했지만......... 왜 되는거지...??? 그래서 다른 경우를 찾아보게 되었다.
.
.
.
찾아본 결과 절대경로는 current directory에서 시작되기 때문이다. 절대경로라고 해서 최고 상위 directory에서 시작하는 것이 아니다. 해당 스크립트가 속한 경로 중에서 dafult로 지정되는 current directory를 파악해 보고 경로를 설정하는 것 이 좋다..

확인해본 결과

current directory 인 caculator 와 main.py가 상위 하위 가 아닌 같은 동일 선상이라서 직접경로가 됬던 겄이었다.!

7. init.py 파일의 역활에 대해서도 정리해 주세용

init 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다. 그리고 특정 티렉터리 의 모듈을 *을 사용하여 import할때에는 init 파일에 all 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다.

profile
하루하루 1cm 자라는 개발자

0개의 댓글