SYS & Path

고준영·2021년 8월 4일
0

Python🐍

목록 보기
4/7
post-thumbnail

1. SYS란?

1. sys module

  • Python은 여러개의 모듈이 합쳐져 프로젝트를 생성한다. 개발자 개인이 패키지, 모듈을 만들어서 추가할 수도 있고, pip를 이용해 여러가지 패키지를 추가 할 수 있다. 아래의 방법으로 import 할 수 있는데 python은 어떻게 모듈과 패키지를 찾는것일까
import something

2. search order

sys.modules => built-in modules => sys.path

2. sys.module vs sys.path

1. sys.module

  • Python이 모듈과 패키지를 찾기 위해 가장 먼저 보는 구역이며, 아래와 같이 dict형태로 저장되어 있다.
  • python을 사용하며 한 번 이상 import 한다면 해당 구역에 저장이 되고, 추후에는 다시 모듈을 찾아서 추가하지 않고, 바로 sys.module을 확인하여 import한다.

2. built-in modules

  • Python에서 설치와 동시에 제공하는 라이브러리

3. sys.path

  • Python이 모듈과 패키지를 찾기 위해 가장 마지막으로 보는 구역이며, pip install 로 설치된 모듈 또한 여기서 찾게 된다. sys.path는 list형태로 이루어져 있고, 우리가 개별적으로 모듈 또는 패키지를 만들어서 사용한다면 이곳에 path를 등록해주어서 사용하면 된다

4. how to find sys

import sys
print(sys)
----아래 결과----

  • 위 스크린샷을 확인해보면 sys는 built-in 되어있는 모듈임!! 따라서 built-in modules에서 찾게 된다

3. 절대경로 vs 상대경로

우리가 pip install을 통해 설치한 모듈 또는 패키지는 경로 관련 이슈가 발생하는 경우는 드물다. 하지만 개인이 직접 만든 모듈, 패키지를 사용 할 때 경로 관련한 이슈가 자주 발생한다.

1. 절대경로

  • absolute path는 해당 프로젝트의 가장 상위 폴더부터 끝까지 생략없이 명확하게 명시 된 경로를 말하는데, 파일들의 위치가 변하면 수정하기 쉬운 장점이 있으나 경로가 상대적으로 길어질 수 있다

  • 위 스크린샷에서 user의 modles.py에 접근하기 위해서는

    my_app => user => models.py

    이렇게 접근해야 할 것이다. 파이썬에서는 프로젝트의 위치는 제외하고 아래처럼 경로를 표현한다

    user.models.py

2. 상대경로

  • relative path는 최상위 경로가 아닌 현재 자기가 속한 경로를 기준으로 정의한다

  • 위 그림의 models.py에서 core파일에 접근하기 위해서는

    ..core.something

    이렇게 접근 할 수 있다.
    .은 파일의 현재 위치를 이야기하며, ..은 현재의 위치보다 상위 디렉토리로 가는 경로이다

    4. main.py with 상대경로

  • 위의 main.py에서 상대경로를 이용하여 add_and>multiply를 import 하게 되면 아래와 같은 에러가 발생한다

  • 에러가 발생하는 이유는 main 모듈에서 상대경로를 사용 할 때 기준점(출발점)인 자신의 위치를 찾지 못하기 때문이다?? 자기 자신이 자기 위치를 모른다고? 뭔 X소리야 할 수 있지만! 모듈을 실행하는 방법을 안다면 충분히 이해를 할 수 있다

    모듈을 실행하는 2가지 방법

    1. 인터프리터(VSCode)에서 직접 실행
    2. 다른 모듈에서 import

    가. 1번의 경우 실행하는 모듈의 이름은 자동적으로 __main__ 으로 변경된다. potato.py 라도 __main__으로 변경 된다
    나. 모듈실행 뒤 상대경로를 통해 다른 모듈을 import 할 때,
    파이썬은 모듈의 이름( __name__ )에 기반을 두고 현재모듈의 위치를 찾는다
    다. __main__으로 이름이 바뀌어 버린 모듈은 파이썬이 해당 위치를 찾을 수 없게 되고, 출발점이 되는 자신의 위치를 알지 못하니 다른 모듈도 import 할 수 없는 것이다
    라. 결론 따라서 main.py에서는 절대경로를 이용하여 import 해주어야 한다

5. Conclusion

Django를 이용해 웹사이트를 만들면서 항상 궁금하던 부분이다. __init__ 이 부분은 니꼬도 사실 잘 알려주지 않아서 정리를 한다거나 공부 할 생각을 하지 못했는데, 알고보니 장고의 내용은 아니고 파이썬의 내용이며, 내가 파이썬에 아직 많이 부족하다는 것을 더욱 잘 알아간다...
추가로 벨로그를 둘러보면 정말 잘 정리한 기술 블로그가 많다
나도 남들이 보기에 깔끔하고 잘 정돈 된 블로깅을 하고 싶은데, 아직 나름의 기준과 명확한 틀이 없는것 같다...
이또한 조금씩 발전하리라 믿고 꾸준히 노력하려 한다!!
느리더라도 정확하게 알고 가자
21.08.04 위코드 1주차 수요일


🐍Tip🐍

1. __init__

  • __init__.py 파일은 해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다.
  • 이 파일이 없다면 패키지로 인식되지 않는다.

2. __all__

  • *을 이용해서 import 할때엔 해당 디렉토리의 __init__.py 파일안 __all__에 import 가능한 모듈을 따로 정의해주어야한다.
profile
코드짜는귤🍊 풀스택을 지향하는 주니어 개발자 입니다🧡

0개의 댓글