장고 셸에서 모듈을 다시로드하는 방법은 무엇입니까?
저는 Django와 함께 일하고, 항상 Django 셸을 사용합니다. 성가신 부분은 Django 서버가 코드 변경 사항에 대해 다시하는 동안 셸은 있지만로드 테스트중인 메서드를 날씨 때마다 셸을 종료하고 다시 시작하고 모든 모듈을 가져옵니다. 필요한 모든 변수를 다시 초기화하십시오. iPython 히스토리가 이것에 대한 많은 타이핑을 저장하지만 여전히 고통입니다. django 개발 서버와 같은 방식으로 django shell 자동 새로 고침을 만드는 방법이 있습니까?
다시로드 () 대해 알고 있지만에 많은 모델을 가져오고 일반적으로 from app.models import *
구문을 사용 하므로 새로 고침 ()는별로 도움이되지 않습니다.
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 가지 자동 다시로드 전략을 사용 하여 일부 가져 오기를 새로 고쳐지는 것을 방지 할 수도 있습니다 .
% 자동 새로 고침
- 이제 모든 모듈 (% aimport에서 제외 된로드 제외)을 자동으로 다시 적용합니다.
% 자동 새로 고침 0
- 자동 새로 고침을 중지합니다.
% 자동 새로 고침 1
- 입력 된 Python 코드를 실행하기 전에 매번 % aimport로 모든 장비 모듈을 다시로드합니다.
% 자동 새로 고침 2
- 입력 된 Python 코드를 실행하기 전에 매번 모든 모듈 (% aimport에 제외 된 모듈 제외)을 다시로드하십시오.
수입 %
- 자동으로 가져 오거나 가져 오지 않을 모듈을 자동으로 가져옵니다.
% aimport foo
- 자동으로 다시로드 표시하십시오.
% aimport -foo
- 'foo'를 자동으로로드하지 않도록 표시합니다.
이것은 일반적으로 내 사용에 적합하지만 몇 가지주의 사항이 있습니다.
- 코드 개체를 교체하는 것이 항상 성공하는 것은 아닙니다. 클래스의 @property를 일반 메소드로 변경하거나 메소드를 멤버 변수로 변경하면 문제가 비공개 수 있습니다 (그러나 이전 개체에서만).
- 다시로드되기 전에 모듈에서 제거 된 (예 : monkey-patching을 통해)
- C 확장 모듈은 다시로드 할 수없는 자동으로 다시로드 할 수 없습니다.
django-extensions 프로젝트 에서 제공하는 manage.py shell_plus 명령을보십시오 . 쉘 시작시 모든 모델 파일을로드합니다. 수정 사항을 자동으로 다시로드하지만 종료 할 필요는 없습니다. 직접 호출 할 수 있습니다.
내 해결책은 코드를 작성하고 파일에 저장 한 다음 다음을 사용하는 것입니다.
파이썬 manage.py 쉘 <test.py
따라서 수정하려는 내용을 수정할 때까지 변경하고 해당 명령을 저장하고 다시 실행할 수 있습니다.
이 주제에 대한 일반적인 합의는 파이썬 reload ()가 형편없고이를 수행하는 좋은 방법이 없다는 것입니다.
Reload ()는 몇 가지 트릭 없이는 Django 셸에서 작동하지 않습니다. 이 스레드 na와 내 대답을 구체적으로 확인할 수 있습니다.
"manage.py shell"을 통해 대화 형 인터프리터를 사용하여 Django 모델 모듈을 어떻게 다시로드합니까?
이 불편함에 대한 나의 해결책은 다음과 같습니다. 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
도움이 되었기를 바랍니다. 물론 디버그 용입니다.
건배.
Django 셸에서 명령을 실행하는 대신 이와 같은 관리 명령을 설정하고 매번 다시 실행할 수 있습니다.
ipython 구성과 함께 shell_plus 를 사용하십시오 . 이것은 autoreload
shell_plus가 자동으로 무언가를 가져 오기 전에 활성화됩니다.
pip install django-extensions
pip install ipython
ipython profile create
ipython 프로필 편집 ( ~/.ipython/profile_default/ipython_config.py
) :
c.InteractiveShellApp.exec_lines = ['%autoreload 2']
c.InteractiveShellApp.extensions = ['autoreload']
셸을 엽니 다. 다음을 포함 할 필요가 없습니다 --ipython
.
python manage.py shell_plus
이제 SHELL_PLUS_PRE_IMPORTS
or SHELL_PLUS_POST_IMPORTS
( docs )에 정의 된 모든 것이 자동으로 다시로드됩니다!
pdb.set_trace()
파일을 저장할 때 셸이 디버거 (예 :)에 있으면 재로드를 방해 할 수 있습니다.
정확히 당신이 원하는 것은 아니지만 나는 이제 테스트하고 물건을 다루기 위해 관리 명령을 직접 만드는 경향이 있습니다.
명령에서 원하는 방식으로 많은 로컬을 설정하고 나중에 대화 형 셸로 이동할 수 있습니다.
import code
class Command(BaseCommand):
def handle(self, *args, **kwargs):
foo = 'bar'
code.interact(local=locals())
재로드는 없지만 django 기능을 대화식으로 테스트하는 쉽고 덜 성가신 방법입니다.
참고 URL : https://stackoverflow.com/questions/3772260/how-to-reload-modules-in-django-shell
'ProgramingTip' 카테고리의 다른 글
NSURL을 사용하여 파일 존재 테스트 (0) | 2020.10.31 |
---|---|
Windows 용 그래픽 HTTP 클라이언트 (0) | 2020.10.31 |
커서 끌기로 텍스트 / 요소 선택을 방지하는 방법 (0) | 2020.10.31 |
텍스트 정렬 : 오른쪽에 (0) | 2020.10.31 |
PHP를 사용하여 JQuery .ajax ()에 대한 적절한 성공 / 오류 메시지를 어떻게 반환합니까? (0) | 2020.10.31 |