21.2.21

커피 내리는 그냥 사람·2021년 2월 21일
0

위코드 pre코스

목록 보기
13/28

<체크포인트4 : 파이썬이 모듈과 패키지를 검색하는 과정 및 방법>

  1. Import Search
    (abc라는 모듈 가정)
import abc

import 했다 -> 어디 있지?(sys.modules > built-in > sys.path 경로 추적)

sys.modules : 가장 먼저 확인. 딕셔너리 형태로 이미 import 된 것들 찾아줌.

built-in modules : 공식 라이브러리

sys.path : 리스트 형태.

만일 다 못 찾으면? : 에러

  1. Absolute path / Relative path
    빌트인이나 설치한 모듈에 대해서는 문제 없이 잘 찾을 수 있지만 local패키지, 즉 직접 개발한 패키지를 임포트 할 때는 경로 선언을 잘 해야 한다. 그 경로가 위의 두 가지다.
    A : 절대경로, 파일이나 경로에 상관 없이 동일하기 때문.(파일 경로의 트리를 생각하면 됨)
    다 정해져 있기 때문에 어려움이 없으나 만일 그 경로가(폴더가 복잡해지고 파일이 많아지면?) 길어진다면??
    -> 단점을 보안하기 위해 relative path가 나왔다.

R : 프로젝트의 최상단 디렉토리를 기준(최고 높이 폴더)이 아니라 import하는 기준에서 경로를 정의. 일반적으로 이미 들어와있는 로컬에서 다른 로컬을 부를 때 많이 사용한다.

# package2/module3.py
 
from . import class1
from .subpackage1.module5 import function2

경로를 줄여준다는 장점은 있지만 헷갈림. 파일 위치가 변경되면 경로 위치도 다시 다 조정해줘야 함.(권장하지 않는 방식)


과제 1 : sys.module vs sys.path
가장 큰 차이점 : sys.module은 딕셔너리({모듈이름} : {모듈경로}) 형태지만 sys.path는 리스트 형태를 지니고 있다.

과제 2 : sys도 import해야 함. sys는 그럼 어떻게 찾을까? : sys는 built-in mudules이므로 따로 import시 어디서 찾을 필요가 없다.(내장형이기 때문에!)

과제 3 : A vs R 차이점
절대 경로는 최상위 디렉토리부터 내려와서 모듈들의 경로가 결정되지만
상대 경로는 현재 Import하는 기준에서 경로를 정의하기 때문에 자칫 경로가 복잡해질 때 단점이 될 수 있다.


(연동 된 것들)
과제 4 : Calculator 패키지 만들기 : VSC로 구현
과제 그림

과제 5 : main.py error 확인하고 공식문서 참고 후 main module에서 패키지의 모듈 어떻게 임포트 해야 하는지?

시도 했을 때 나오는 에러 :

ValueError: Attempted relative import in non-package

직역하면 값 에러로 시도된 상대적인 import가 없는 패키지에 있다는 것 같다.

  • 시도 해본 것 : from .. ~ import
    ; 같은 에러 남

  • 그래서 .을 아예 지워보기로 함 ; 성공
    왜 성공했을까? : 알고 보니 절대 경로로 바꾼 사례여서 성공한 것임. 근데 문제가 상대경로이므로 다른 경우의 수 찾아보자.

먼저 relativ path를 언제 썼더라? :

일반적으로 relative path는 local package 안에서 다른 local package를 import 할때 사용

하지만 공식문서에서 나온 것을 보면?

상대 임포트가 현재 모듈의 이름에 기반을 둔다는 것에 주의하세요. 메인 모듈의 이름은 항상 "main" 이기 때문에, 파이썬 응용 프로그램의 메인 모듈로 사용될 목적의 모듈들은 반드시 절대 임포트를 사용해야 합니다.

내가 풀어야 하는 문제는 현재 서브 패키지로 구조화된 패키지 하나와 메인 py가 있는 구조다. 그런데 공식문서 상 메인의 경우는 절대 임포트를 사용해야 하므로 . 을 없애고 절대 임포트를 하는 것이 옳다.

과제 6 : add~.py 에서 A, R 각각 임포트 해보고 main 모듈과 차이점 생각, 결과도 출력해보기
main모듈과의 차이점 : 메인은 절대 임포트를 사용해야 하는 상황이었음.

  • 절대 경로 : 에러 없이 출력 가능하게 만듦.
from multiplication import multiply
  • 상대 경로 : '로컬 패키지' 안에서 다른 '로컬 패키지'를 임포트한다.

에러가 계속 나는 이유에 대한 생각 :

  • 현재 상대 경로로 모듈에서 모듈을 불러오는게 가능할까?
  • main.py는 __main__ 이라는 요소로 인해 모듈들을 불러와 결과를 냈지만 위 파일들은 그렇지 못한 상황이라고 판단. 그래서 절대경로로는 이상없이 되지만 상대 경로로는 이와 같은 속성이 없기 때문에 불가능하지 않을까?
    -> 이에 대한 서치 결과 :
    참고 블로그

    ImportError: attempted relative import with no known parent package

    이유는 python 자체에서 패키지와 모듈을 가져와 함수를 쓰는 곳에서는 상대경로로 접근자체가 불가능하게 막아놓았다.


과제 7 : __init__.py 파일의 역할은? : 이 파일은 해당 디렉토리가 패지키의 일부임을 알려주는 역할을 한다. ; 일종의 패키지다! 라고 선언해주는 표시 같은 역할. 이 외에도 패키지를 초기화 하는 역할을 한다.(장고에서 많이 본 것 같다.)

profile
커피 내리고 향 맡는거 좋아해요. 이것 저것 공부합니다.

0개의 댓글