NameError를주는 모듈을 다시로드하는 중 : 이름 'reload'가 정의되지 않았습니다.


162

파이썬 3에서 이미 가져온 모듈을 다시로드하려고합니다. 한 번만 가져 와서 import명령을 다시 실행하면 아무것도하지 않는다는 것을 알고 있습니다.

실행 reload(foo)하면 다음과 같은 오류가 발생합니다.

Traceback (most recent call last):
    File "(stdin)", line 1, in (module)
    ...
NameError: name 'reload' is not defined

오류는 무엇을 의미합니까?

답변:


239

reload 파이썬 2에는 내장되어 있지만 파이썬 3에는 내장되어 있지 않으므로 오류가 예상됩니다.

Python 3에서 모듈을 다시로드 해야하는 경우 다음 중 하나를 사용해야합니다.


37
이 답변은 파이썬 3에서 모듈을 다시로드하는 것이 좋지 않은 것처럼 들립니다. 이것에 대한 생각은 무엇입니까?
ABM

11
재 장전은 항상 문제가됩니다. 다시로드하면 모듈 변수가 업데이트되지만 이전 변수는 제거되지 않으므로 이름을 바꾸면 이전 이름이 계속 존재합니다. 클래스 정의를 변경해도 기존 객체는 여전히 이전 유형을 갖습니다. 마지막으로, 일부 모듈은 가져 오기시에 코드가 두 번 실행되도록 설계되지 않았습니다. 따라서 재로드를 피하는 것이 좋지만 종종 매우 편리합니다.
Evan

13
나는 종종 문제가 있지만 항상 그런 것은 아니라고 말합니다 . 확실히, 나는 reload스크립트 에 쓰는 유효한 사용 사례는 실제로 매우 드물다고 생각하며 , 그런 종류의 어두운 예술을 사용하는 사람들은이 의견을 읽지 못할 것입니다. 그러나 모듈을 개발 중이고 IPython 콘솔을 사용하여 대화식으로 테스트하는 경우 reload해당 작업 흐름에서 유용 할 수 있습니다. 그러나 @Evan이 말했듯이 수입 시간 부작용을 조심하십시오. 일반적으로 reload다른 사람의 모듈 을 사용하지 말고 싶습니다 . reload디자인 타임에는 자신 만의 것이 좋습니다.
Tim D

6
작업에 Jupyter 노트북을 사용하고 깔끔하게 정리하기 위해 최소한의 수정이 필요한 작업을 가져 오기 가능한 패키지에 넣었습니다. 그러나 노트북 커널이 문자 그대로 계산하는 데 하루 종일 걸린 메모리 계산을 수행하기 때문에 때로는 수정이 필요하며 다시로드하는 것이 옳은 일입니다.
Scott

재로드는 데이터베이스 기능과 같이 시간이 많이 걸리는 호출로 라이브러리를 적극적으로 개발하는 데 필수적입니다. 그러나 모듈을 다시로드에서 발생할 수있는 주요 문제 중 하나는 장식과 그 기능을 다시로드 제대로 볼 수 없습니다 경향이있다 여기
알렉산더 맥팔레인

82

> = Python3.4의 경우 :

import importlib
importlib.reload(module)

<= Python3.3의 경우 :

import imp
imp.reload(module)

Python2.x의 경우 :

내장 reload()기능을 사용하십시오 .

reload(module)

48
import imp
imp.reload(script4)

7
Python 3.4부터 사용되지 않습니다 importlib. 대신 사용하십시오.
Mark Amery

39

이전에 작성된 답변을 확장하려면 Python 버전 2 및 3에서 작동하는 단일 솔루션을 원할 경우 다음을 사용할 수 있습니다.

try:
    reload  # Python 2.7
except NameError:
    try:
        from importlib import reload  # Python 3.4+
    except ImportError:
        from imp import reload  # Python 3.0 - 3.3

12

모든 파이썬 버전에서 작동하므로 다음 코드를 사용하는 것이 좋습니다 (필요합니다 six).

from six.moves import reload_module
reload_module(module)

2

python2 및 python3 호환성을 위해 다음을 사용할 수 있습니다.

# Python 2 and 3
from imp import reload
reload(mymodule)

1
이것은 Python 3.7 및 그 이전 버전에서 작동하지만 @Alex Martelli가 아래에 쓴 것처럼 사용되지 않습니다. 'six.moves 수입 reload_module에서'사용 Alleo의 대답
찰스 Plager

2

외부 라이브러리를 사용하지 않으려면 한 가지 해결책은 다음과 같이 Python 3의 Python 2에서 reload 메소드를 다시 작성하는 것입니다. 모듈 상단에서 이것을 사용하십시오 (python 3.4+로 가정).

import sys
if(sys.version_info.major>=3):
    def reload(MODULE):        
        import importlib
        importlib.reload(MODULE)

python 파일을 구성 파일로 사용하고 응용 프로그램을 다시 시작하지 않으려면 BTW 다시로드가 매우 필요합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.