하얀설표 블로그




해결)ImportError: attempted relative import with no known parent package





( 수정됨)


에러

ImportError: attempted relative import with no known parent package

해결방법

서로 다른 폴더에 위치한 코드를 상대경로로 import하고 있기 때문에 생기는 에러이다.
sys.path에 상위 디렉토리 경로를 추가하고, 상대경로가 아닌 절대경로로 import하면 에러를 방지할 수 있다.

설명

내용

이번 설명에서 코드들의 위치 경로는 다음과 같다.

seolpyo ─ white ┬ a ─ aa.py
                       └ b ─ bb.py

각 경로에 위한 파이썬 코드들의 내용은 다음과 같다.

# seolpyo.white.a.aa.py
from ..b.bb import bb
bb()

# seolpyo.white.b.bb.py
def bb():
    print('하얀설표')

이런 구조에서 aa.py를 실행하면 에러가 발생하게 된다.

# seolpyo.white.a.aa.py
from ..b.bb import bb
bb()
>> ImportError: attempted relative import with no known parent package

에러를 방지하기 위해선 3가지 방법을 선택할 수 있다.
내가 선택한 것은 2번 안이다.

  1. aa.py와 bb.py를 같은 경로에 위치하게 한다.
  2. 상대경로에서 절대경로로 바꾸고, 상위 폴더를 sys.path에 추가해준다.
  3. OS 설정에서 작성한 코드들이 들어있는 경로를 추가하는 작업을 수행한다.

path/to/white/seolpyo/a/aa.py를 다음과 같이 수정해준다.
참고로 path/to/는 실제 경로가 아니라 white라는 폴더가 위치하는 상위경로를 대체하여 표시한 것이다.
시스템 path를 추가할 때, pathlib.Path 모듈을 사용하지 않고 직접 경로를 str로 작성하여 넣어줘도 무관하다.

# seolpyo.white.a.aa.py
from sys import path
import pathlib
seolpyo = pathlib.Path('path/to/seolpyo/')
# https://white.seolpyo.com/
path.append(seolpyo.__str__())
print(path)
from white.b.bb import bb
bb()
>> 하얀설표


공감 : 0







white.seolpyo.com