hyunjin

No module name error 본문

개인 공부/환경세팅

No module name error

_h.j 2022. 7. 18. 16:04
728x90

문제

패키지/모듈을 하나 만들었고 아래와 같은 디렉토리 구조를 가지고 있다. 간단히 유닛테스트를 작성하려고 하는데 No module named… 하는 에러가 발생한다. 아니, 꼭 유닛테스트가 아니라 단순히 내가 만든 패키지/모듈을 불러쓰려고 하는데도 No module named… 에러가 발생한다. 도대체 뭐가 잘못된 걸까?

PROJECT_DIR
  L PACKAGE_DIR
    L __init__.py
    L module.py
  L TEST_DIR
    L __init__.py
    L test.py

 

원인

위 디렉토리 구조를 보자. 우리가 만든, 그러니까 불러다 쓸 패키지/모듈의 최종 파일은 module.py이다. 그리고 test.py파일에 from PACKAGE_DIR import module 처럼 임포트했다. 이 상태에서 No module named … 에러가 발생하는 것이다.

기본적으로 파이썬은 모듈을 불러올 때 패키지 설치 경로와 자신의 현재 위치를 참조한다. 이런 이유로 바로 위 상위 디렉토리라도 불러오지 못하는 일이 발생하게 된다. ..(점 두 개)를 이용해 상대 경로로 참조하려는 시도를 했다면 아마 아래와 같은 에러를 만나게 될 것이다.

ValueError: attempted relative import beyond top-level package

그러니 이것도 올바른 방법이 아니다.

 

해결방법

여기서는 크게 3가지 방법을 언급한다. 결국은 파이썬 파일이 우리가 만든 패키지/모듈을 찾을 수 있게 해주는게 핵심이다.

 

1. sys path에 내가 만든 패지키 경로 추가하기(흐음…)

파일 코드 제일 처음에 아래와 같이 써준다.

 

import sys
sys.path.insert(0, '/home/user/PROJECT_DIR/PACKAGE_DIR')

그런데 이렇게 하면 절대 경로를 사용해야 하기 때문에 다른 사람하고 공유한다든지, 다른 컴퓨터에서 작업해야 할 경우 좀 불편한 점이 없지 않다.

 

3. setup.py 이용하기(추천)

파이썬에서 배포용 패키지를 만들 때 사용하는 setup.py를 이용한다. 이 파일을 이용해 아래 명령을 쓰면 현재 디렉토리 PROJECT_DIR에 우리가 만든 패키지를 설치해주고 위 from PACKAGE_DIR…. 구문도 정상적으로 동작하게 된다. (PROJECT*DIR 내에 *패키지명.egg-info_ 이름을 가진 디렉토리가 생긴다. 참고로 당연한 얘기지만 이 디렉토리를 git으로 관리하지 않는다.)

 

python setup.py develop
#혹은
pip install .

잠깐, setup.py 없이 위 명령을 실행하면 setup.py 파일이 없다는 메시지를 보게 된다. setup.py 파이썬 공식문서를 보고 복사해서 자기에게 맞게 내용을 바꿔서 사용하면 된다.

-->

내가 실행할 그 프로젝트에서?

python -m pip install --upgrade pip

 

 

 

 

 

원본링크

 

728x90