TIL-6. 모듈과 패키지

solarrrrr·2021년 10월 11일
0

Today I Learned

목록 보기
6/74
post-thumbnail

1. sys.mudules와 sys.path의 차이점

  • sys.modules
    sys.modules는 딕셔너리 형태로 되어 있으며, 이미 import된 모듈이나 패키지들을 저장하고 있다.
    그렇기 때문에 처음 import 하는 모듈은 이곳에서 찾을 수 없다.

  • sys.path
    sys.path는 리스트 형태로 되어 있으며 string 요소들을 가지고 있다.
    각 string의 요소들은 경로를 나타낸다.

2. sys 모듈의 위치는 어떻게 찾을까?

sys 모듈은 파이썬에 포함되어 있는 모듈이다.

import sys
print(sys.path)

이렇게 경로를 찾을 수 있다.

3. Absolute path와 relative path의 차이점

  • 일단 이 두 가지 모두 직접 제작한 Local package를 import 하는 경로를 말한다.
  • Absolute path는 절대 경로로서 import 하는 파일이나 경로에 상관 없이 항상 경로가 동일하다.
    윈도우로 예를 들자면 윈도우 폴더 안에 시스템 폴더를 예로 들면
    c:\windows\system\ 이 안에 들어 있는 모든 파일들은
    절대경로가 모두 같다.
    최상단 디렉토리를 기준으로 내려와 내가 사용할 모듈 혹은 패키지 혹은 기능들이 들어 있는 주소를 가리키는 방식이 Absolute path이다.
    한 프로젝트 아래에서는 어느 위치, 어떤 파일을 import 하든 경로가 같기 때문에 절대경로라고 부른다.
    대부분의 Local package import 시 절대경로를 사용한다.
from package2.subpackage1.module5 import function2
  • 하지만 경로가 너무 길어진다는 단점이 있는데 이럴 때 relative path를 사용한다.
  • relative path는 import 하는 위치를 기준으로 경로를 정의한다.
    import 하고자 하는 대상이 가장 하위 경로에 있더라도
    최상위 루트부터 절대경로를 모두 써주는 것이 아니라 현재 위치를 기준으로 써주면 된다.
from .subpackage1.module5 import function2
  • 닷(.)은 현재 위치를 나타내며 닷을 2개 사용하면 상위 경로를 뜻하게 된다.
  • relative path는 경로의 길이를 줄여줄 수 있지만 헷갈리기도 쉽고 파일 위치가 변경되면 경로의 위치도 변경돼야 하는 단점을 가지고 있다.
  • 그러므로 Absolute path 사용을 권장한다.

4. calculator 패키지 만들기

4-1. main.py에서 상대경로로 add_and_mutiply를 import 했을 때 발생하는 에러를 확인하고 메인 모듈에서 패키지 모듈을 어떻게 import 해야 하는가.

ImportError: attempted relative import with no known parent package
  • 이러한 오류가 나왔다.
    파이썬 공식 문서에서는 main.py에서는 절대 경로로 패키지 모듈을
    import 하라고 되어 있다.

4-2. add_and_multiply.py에서 multiply 함수를 절대경로와 상대경로로 각각 import 해 보고, main 모듈과의 차이점을 생각해 보자.

  • vscode로 실행하면서 엄청 헤맸다. 경로 개념이 윈도우와 비슷하기에
    어려울 것 없다고 생각했는데...
    어떤 블로그에서 보았는데 모듈의 실행 방법엔 두 가지고 있는데
    첫 번째는 직접 실행하는 것과 두 번째는 간접 실행 하는 것이 있다.
    간접 실행이라는 건 어떤 모듈에서 해당 모듈을 불러오는 형태를 말한다.

vscode에서 4-2 예제를 실행해 보는데 상대경로든 절대경로든
모두 오류가 나왔다.
이유는 아래와 같았다.

파이썬에는 모듈을 직접 실행할 때 메인 모듈로 인식하고, 메인 모듈의 경우 이름이 무조건 __main__으로 바뀌게 되어 있는데
이렇게 모듈 이름이 바뀌어버리기 때문에 파이썬이 해당 모듈을 찾을 수 없어서
오류를 뿜게 되는 것이었다.
그러니 당연히 절대경로든 상대경로든 안 되는 게 당연한데..
왜 검색해 보면 어떤 사람은 상대 경로가 되고, 어떤 사람은 절대 경로가 된다고 하는지 혼란스러웠다.

해당 모듈을 직접 실행했을 때는 절대경로든 상대경로든 오류가 나는 것이 맞다.
상대경로 실행시: 내가 최상위이므로 부모 패키지 찾을 수 없다고 나옴.
절대경로 실행시: 내가 최상위이므로 calculator 모듈을 찾을 수 없다고 나옴.

해당 모듈을 직접 실행하지 않고 main.py를 실행하되
add_and_multiply.py 모듈의 import 경로를 절대경로와 상대경로
바꿔서 해 보니 둘 다 정상 동작하였다.

정리하면,

  • 모듈을 실행하는 방법은 직접 실행과 간접 실행으로 나뉘며
    직접 실행을 하면 모듈의 이름이 main으로 변경되기 때문에
    패키지 안에 있는 모듈의 경우 경로 인식에 문제가 생긴다.

  • 패키지 밖에 있는 main.py은 당연히 밖에 있으므로 절대경로만 사용 가능하다.

  • 패키지 안에 있는 모듈들은 참조의 형태로 사용하면 되는데, 절대경로이든 상대경로이든 관계 없으나 절대경로를 되도록 쓰는 것이 좋다.

4-3. __init__ 파일의 역할

  • 해당 디렉토리가 패키지라는 것을 파이썬에게 알려주는 역할을 한다.
  • 파이썬 3.3 버전부터는 이 파일이 없어도 인식한다고 하지만 그냥 생성하도록 하자.
  • 이 파일 내부에 __all__ 변수를 선언할 수 있는데,
    여기에 등록된 모듈만 사용할 수 있도록 제한할 수 있다.
from colculator import * <-- # 이렇게 *을 이용해 사용한다.
profile
몰입

0개의 댓글