Python

[Jupyter] Import한 외부 모듈 변경점이 반영되지 않는 경우

비번변경 2024. 2. 28. 20:12

현상

Jupyter Notebook에서 다음과 같이 외부 모듈을 Import 하여 사용하고 있다.

 

예시 )

- test.py

# test.py
def test_func():
    return 10

- Notebook

import test

test.test_func()

그리고 test 모듈에 test_func_v2라는 새로운 함수를 추가한 뒤, Notebook에서 실행하려고 했다.

 

- test.py 수정

# test.py
def test_func():
    return 10

def test_func_v2():
    return 20

- Notebook 수정

import test

test.test_func_v2()

하지만 사진과 같이 test 모듈에 test_func_v2라는 함수가 없다는 에러가 발생했다.

원인을 확인하고 해결한 방법을 적어둔다.

 

 

원인

확인해보니 Jupyter Nobebook은 모듈을 한 번 불러오면 커널을 재시작할 때까지 다시 불러오지 않는다고 한다. 따라서 한 번 불러온 모듈에 수정사항이 발생해도, 불러온 시점의 모듈을 기준으로 코드를 실행한다.

 

 

해결 방법

1. 노트북 커널 재시작

가장 간단한 해결 방법은 노트북 커널을 재시작하는 것이다.

이후에 노트북 셀을 다시 실행하면 외부 모듈을 다시 불러오면서 정상적으로 동작이 이뤄진다.

 

2. autoreload 기능 사용

다만 매번 노트북 커널을 재시작하는 건 불편하기 때문에 주피터 노트북이 제공하는 확장 프로그램인 autoreload 기능을 사용할 수 있다.

%load_ext autoreload
%autoreload 2

%load_ext은 확장 프로그램을 로드하는 IPython Magic 명령으로, autoreload의 사용법은 다음과 같다.

%autoreload : %aimport에 의해 제외된 모듈 외 모든 모듈을 자동 재로드
%autoreload 0 : 자동 재로딩 비활성화
%autoreload 1 : 파이썬 코드를 실행할 때마다 %aimport로 import한 모든 모듈을 재로드
%autoreload 2 : %aimport에 의해 제외된 모듈외 모든 모듈을 파이썬 코드를 실행할 때마다 재로드
%aimport : 자동으로 import하거나 import하지 않을 모듈 목록 확인
%aimport foo : foo 모듈을 가져오고 $autoreload 1 명령으로 import할 모듈로 표시
%aimport -foo : foo 모듈을 재로딩 목록에서 제외

 

파이썬 셀을 실행할 때마다 모듈을 재로딩하고 싶다면 아래와 같이 사용하면 된다.

이제 외부 모듈을 수정하고 커널을 재시작하지 않아도 Jupyter Notebook에서 정상적으로 동작하는 모습을 확인할 수 있다.

 

 

참고 문서

https://ipython.readthedocs.io/en/stable/config/extensions/index.html

https://ipython.org/ipython-doc/3/config/extensions/autoreload.html

주피터 노트북에서 파이썬 모듈 자동 리로드하기

728x90