[python] 장고 셸에서 모듈을 다시로드하는 방법은 무엇입니까?

저는 Django와 함께 일하고 있으며 항상 Django 셸을 사용합니다. 성가신 부분은 Django 서버가 코드 변경 사항에 대해 다시로드하는 동안 셸은 그렇지 않으므로 테스트중인 메서드를 변경할 때마다 셸을 종료하고 다시 시작하고 모든 모듈을 다시 가져와야한다는 것입니다. 필요, 필요한 모든 변수를 다시 초기화하십시오. iPython 히스토리가 이것에 대한 많은 타이핑을 저장하지만 여전히 고통입니다. django 개발 서버와 같은 방식으로 django shell 자동 새로 고침을 만드는 방법이 있습니까?

reload ()에 대해 알고 있지만 많은 모델을 가져오고 일반적으로 from app.models import *구문을 사용 하므로 reload ()는별로 도움이되지 않습니다.



답변

dongweiming이 위에서 언급 한 것처럼 django-extensions 프로젝트를 사용하는 것이 좋습니다. 그러나 ‘shell_plus’관리 명령 대신 다음을 사용하십시오.

manage.py shell_plus --notebook

웹 브라우저에서 IPython 노트북이 열립니다. 셀, 가져 오기 등의 코드를 작성하고 실행하십시오.

모듈을 변경할 때 노트북 메뉴 항목 ‘Kernel-> Restart’를 클릭하십시오.

이제 코드가 수정 된 모듈을 사용하고 있습니다.


답변

IPython autoreload 확장 프로그램을 사용하는 것이 좋습니다 .

./manage.py shell

In [1]: %load_ext autoreload
In [2]: %autoreload 2

그리고 지금부터 가져온 모든 모듈은 평가 전에 새로 고쳐집니다.

In [3]: from x import print_something
In [4]: print_something()
Out[4]: 'Something'

 # Do changes in print_something method in x.py file.

In [5]: print_something()
Out[5]: 'Something else'

%load_ext autoreload명령 전에 무언가를 가져온 경우에도 작동합니다 .

./manage.py shell
In [1]: from x import print_something
In [2]: print_something()
Out[2]: 'Something'

 # Do changes in print_something method in x.py file.

In [3]: %load_ext autoreload
In [4]: %autoreload 2
In [5]: print_something()
Out[5]: 'Something else'

%aimport명령 및 3 가지 자동 다시로드 전략을 사용 하여 일부 가져 오기가 새로 고쳐지는 것을 방지 할 수도 있습니다 .

% autoreload

  • 이제 모든 모듈 (% aimport에 의해 제외 된 모듈 제외)을 자동으로 다시로드합니다.

% autoreload 0

  • 자동 새로 고침을 사용 중지합니다.

% autoreload 1

  • 입력 된 Python 코드를 실행하기 전에 매번 % aimport로 가져온 모든 모듈을 다시로드합니다.

% autoreload 2

  • 입력 된 Python 코드를 실행하기 전에 매번 모든 모듈 (% aimport에 의해 제외 된 모듈 제외)을 다시로드하십시오.

% aimport

  • 자동으로 가져 오거나 가져 오지 않을 모듈을 나열합니다.

% aimport foo

  • ‘foo’모듈을 가져 와서 % autoreload 1에 대해 자동으로 다시로드되도록 표시하십시오.

% aimport -foo

  • 자동으로 다시로드되지 않도록 ‘foo’모듈을 표시합니다.

이것은 일반적으로 내 사용에 적합하지만 몇 가지주의 사항이 있습니다.

  • 코드 개체를 교체하는 것이 항상 성공하는 것은 아닙니다. 클래스의 @property를 일반 메서드로 변경하거나 메서드를 멤버 변수로 변경하면 문제가 발생할 수 있습니다 (그러나 이전 개체에서만).
  • 다시로드되기 전에 모듈에서 제거 된 (예 : monkey-patching을 통해) 기능은 업그레이드되지 않습니다.
  • C 확장 모듈은 다시로드 할 수 없으므로 자동으로 다시로드 할 수 없습니다.


답변

내 해결책은 코드를 작성하고 파일에 저장 한 다음 다음을 사용하는 것입니다.

파이썬 manage.py 쉘 <test.py

따라서 수정하려는 항목을 수정할 때까지 변경하고 해당 명령을 저장하고 다시 실행할 수 있습니다.


답변

django-extensions 프로젝트 에서 제공하는 manage.py shell_plus 명령을보십시오 . 쉘 시작시 모든 모델 파일을로드합니다. 수정 사항을 자동으로 다시로드하지만 종료 할 필요는 없습니다. 직접 호출 할 수 있습니다.


답변

이 주제에 대한 일반적인 합의는 파이썬 reload ()가 형편없고이를 수행하는 좋은 방법이 없다는 것입니다.


답변

이 불편함에 대한 나의 해결책은 다음과 같습니다. IPython을 사용하고 있습니다.

$ ./manage.py shell
> import myapp.models as mdls   # 'mdls' or whatever you want, but short...
> mdls.SomeModel.objects.get(pk=100)
> # At this point save some changes in the model
> reload(mdls)
> mdls.SomeModel.objects.get(pk=100)

들어 파이썬 3.x를 , ‘다시로드’는 사용하여 가져올 수 있어야합니다 :

from importlib import reload

도움이 되었기를 바랍니다. 물론 디버그 용입니다.

건배.


답변

Reload ()는 약간의 트릭 없이는 Django 셸에서 작동하지 않습니다. 이 스레드 na와 내 대답을 구체적으로 확인할 수 있습니다.

“manage.py shell”을 통해 대화 형 인터프리터를 사용하여 Django 모델 모듈을 어떻게 다시로드합니까?