본문 바로가기
NaverBoost Camp 4기/[P stage] Final Project

[P stage][Final Proj] 캡슐화 관련 Error 분석

by 하람 Haram 2023. 1. 11.
728x90

Fish Data를 bbox대로 Crop 하는 코드를 짜보도록 한다

branch를 만들어주고

Develop의 하위 branch로 만들어 주도록 한다

 

캡슐화 문제

코드 리뷰에 앞서서 캡슐화 과정에서 경험했던 문제를 포스팅 하고자 한다

눈물의 똥꼬쇼...

 

문제 상황은 다음과 같았다.

main 문에 함수를 전부 때려 박자니 너무 지저분 해지고 유지보수가 어려울 것 같아서 다음과 같은 구조로 분할하고자 하였다.

 

📂Data_prepare

┣ 📂Function

┃ ┣ 📜annotation_part.py

┃ ┗ 📜image_part.py

┗ 📜Fish_Data_Crop.py

 

이 과정에서 함수화를 하여 캡슐화 하는 과정이 필요하였고 다음과 같이 VSC 의 힌트를 통해

다음의 코드로 import를 하였다.

from jzone_workspace.Data_prepare.Function.annotaion_part import make_annotation

먼저 저건 내 워크스페이스여서 팀원들과 공유하기엔 readme를 작성해야하는 번거로움이 있고

결정적으로

ModuleNotFoundError: No module named 'jzone_workspace

 

안된다고 한다

 

그래서 상대경로로 바꾸면 가능하지 않을까 라는 생각으로

from .Function.annotaion_part import make_annotation

로 진행하였고

ImportError: attempted relative import with no known parent package

 

부모 패키지를 찾을 수 없다고 한다

 

이 원인은 다음 블로그에서 잘 설명하고 있는데

 

https://daco2020.tistory.com/62

 

파이썬에서 직접 만든 패키지를 불러오자. (feat. 절대 경로와 상대 경로)

파이썬에 내장된 패키지나 모듈은 build-in modules에, pip 등으로 다운로드한 패키지나 모듈은 sys.path에 저장되기 때문에 쉽게 이름만으로 불러올 수 있지만, 직접 만든 로컬 패키지의 경우 '절대 경

daco2020.tistory.com

위의 블로그의 말에 따르면

 

 

이 이유에 대해 파이썬 공식 문서에서는 다음과 같이 설명하고 있다.

 

 

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

결국 main.py는 시스템상 package와 동일 선상에 있지만, 막상 package를 import를 하려고 하면 동일 선상이 아니라고 하는 것이다. 그리고 이는 main.py 뿐만 아니라 다른 모듈도 마찬가지이기 때문에 어떤 모듈이든 직접 실행하면 상대 경로는 사용할 수 없게 된다. 

한마디로 정리해보자면 다음과 같다.

"모듈을 직접 실행하면 해당 파일의 이름이 달라지므로 [상대 경로]가 기준 위치를 알 수 없게 되어 경로를 찾지 못한다."

 

 

라고한다. 

 

 

요약을 해보면

 

직접 실행하는 메인 모듈의 이름이 __name__ 에서 __main__ 으로 바뀌게 되는데

상대 경로는 __name__을 통해 위치를 파악해서 경로를 계산하기 때문에 기준 위치를 파악할 수 없다고 한다

 

이를 해결하고자

실행되고 있는 현재 디렉토리가

root@d168dc67f9b4:~/jzone_workspace/Data_prepare

이므로 다음과 같이

from Function.annotaion_part import make_annotation

라 적으면 이게 절대 경로 아닐까 라는 생각을 하였고

결과는 

성공이다

 

추가로 __init__ 으로 무언갈 패키지화 하는 거랑 __name__ 에 대해 설명하는 블로그가 있는데

이에 대해서는 추가적인 공부가 필요할 것 같다

https://velog.io/@anjaekk/python%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C-%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C-import-%EC%97%90%EB%9F%AC%EC%9D%B4%EC%9C%A0%EC%99%80-%ED%95%B4%EA%B2%B0

 

[python]절대경로&상대경로, 상대경로 import 에러 이유와 해결

Absolute path(절대경로)와 Relative path(상대경로), 그리고 상대경로를 이용해여 import 했을 때 생기는 에러에 대해 알아보자.

velog.io

 

 

 

 

728x90