Today I Learn (TIL)

#17 Python module과 package 이용 예제, 오류 대처 방안

이웃집 친구 2020. 6. 28. 17:50
# relative path
from .calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

 

이 때, main.py랑 calculator 폴더는 같은 디렉토리이다.

add_and_multiply.py는 calculator폴더 안에 위치해있는 상태이다. 이렇게 실행 해보면

 

Traceback (most recent call last):
  File "C:/projects/main.py", line 5, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package

importerror가 발생한다, relative path를 찾지 못해서 그런건데 이때 calculator의 위치 앞에 . 을 제거해서 디렉토리에 맞게 설정해주면 해결된다.

 

 

수정된 코드

 

# relative path
from calculator.add_and_multiply import add_and_multiply

if __name__ == '__main__':
    print(add_and_multiply(1,2))

출력:

5

 

느낀점:

경로를 찾을 때, absolute path와 relative path중 어떻게 앞으로 사용될까 고민해보았다.

relative path는 상대적인 위치로 찾기 때문에, 디렉토리가 덜 복잡하고 어떻게 되어있는지 알면 오히려 코드도 짧게 쓰고 간편하게 느꼈다.

하지만 해보면서 느꼈지만 실수가 정말 .하나에 좌우되기 때문에 실수가 잦을 것으로 예상된다.

반면에, absolute path는 어떤 폴더에 어떤 파일 그리고 어떤 기능을 import하겠다.

상단부터 하단 레벨까지 내려가는 개념이라 import할 때마다, 폴더명, 모듈명을 다 쳐야하지만

그만 큼 상대적 위치에 신경을 쓰지 않아서 실수가 적을 것으로 예상된다.

 

 

<   __init__.py 파일에 대해서    >

아직 개발은 한번도 해본적 없지만, 앞으로 많이 하게 되면 django같은 패키지를 사용 할 것으로 예상된다.

그렇다면 pip로 다운받는 패키지말고 직접 만든 모듈을 사용 할때는 어떻게 해야할까?

working folder에 __init__.py를 만들어 해당 디렉토리가 패키지임을 알려주는 것부터 해야한다.

파이썬 3.3버전 이후로는 해당 파일을 직접 만들어 주지 않아도 패키지로 인식되고 있긴하다.

__init__.py는 package가 import 될 때 초기설정을 가능하게 해주는 py파일이다.

 

#at __init__.py


from pkg1.mod1 import func1
from pkg1.mod2 import func2