jupyter notebook 에서 parent directory 접근 (from .. import 등..) 가능한가요?

torchvision 구현체를 jupyter notebook 으로 옮기려던 도중에

from …transforms._presets import ImageClassification, InterpolationMode

했더니

attempted relative import beyond top-level package

에러가 뜨는군요.

검색해 보니 python command line에서 상위 디렉토리에서 소스 코드 호출해 주는 방법만 나오는데,

Jupyter Notebook 에서는 실행 프로그램 코드의 상위 디렉토리 접근이 불가능한가요?

혹시 import 하고자 하는 모듈과 working directory의 파일 위치를 알 수 있으면 답변에 도움이 될 것 같습니다.
image

이런 식의 캡처를 올려주시거나, 폴더 계층 관계를 더 설명해주실 수 있으실까요?

이미지 출처: Python 데이터 과학 클라이언트 설정 - SQL Server Machine Learning Services | Microsoft Docs

답변감사합니다.

D:\JupyterNoteBook\PyTorchTutorialProject\PytorchVision공식구현체\torchvision\models\VGGNet.ipynb 을 만들었고

D:\JupyterNoteBook\PyTorchTutorialProject\PytorchVision공식구현체\torchvision\transforms\_presets.py 를 import 하고 있습니다.

(즉 working directory 기준으로 …\transforms\_presets.py 내의 함수들을 import 하기 위해

from …transforms._presets import ImageClassification, InterpolationMode

를 호출했고, 결과는

----> 7 from …transforms._presets import ImageClassification, InterpolationMode
8 from …utils import _log_api_usage_once
9 from …_api import WeightsEnum, Weights

ValueError: attempted relative import beyond top-level package

와 같이 떴습니다. (점은 두개인데, 여기서 글로 올리니 세개가 되어 보이는군요. 실제 소스에는 다 두개씩입니다.)

1개의 좋아요

아래와 같이 import 하고자 하는 모듈 경로를 직접 추가해주는 방법이 가장 간단해 보입니다.

import sys
module_path = "(transforms 폴더까지의 절대 경로)"
sys.path.append(module_path)

from transforms._presets import ImageClassification, InterpolationMode

다만 이 경우 매 노트북 파일마다 설정을 추가해주셔야 할 것 같아서요,
더 간편하고 명확한 해결책/ 원인을 찾으면 추가 댓글로 달아보겠습니다.

2개의 좋아요

아래 링크의 질문도 디렉토리 구조가 유사해보이는데요. 참고해보실만 할 것 같습니다.

meta_project
    project1
        __init__.py
        lib
            module.py
            __init__.py
    notebook_folder
        notebook.jpynb

질문자는 이런 디렉토리 구조를 갖고 있으며, @paradism 님의 torchvision\까지가 위의 meta_project의 경로에 해당할 것 같습니다.

아래는 @bowoo.jang 님께서 달아주신 것과 같은 역할을 하는 코드입니다. :slight_smile:

import os
import sys
module_path = os.path.abspath(os.path.join('..'))
if module_path not in sys.path:
    sys.path.append(module_path)

이후에 아래와 같이 불러서 사용하는데요,

from project1.lib.module import function

이 부분과 동일할 것 같습니다.

추가로 각 디렉토리에 __init__.py가 있어야 한다고 하니 참고해주세요.

Note that it is necessary to add empty __init__.py files to project1/ and lib/ folders if you don't have them already.

위 링크에 다른 해결책들도 제안되어 있으니 참고해보셔도 좋을 것 같습니다. :smiley:

2개의 좋아요

답변 주신 두분 모두 감사드립니다.

1개의 좋아요