source

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

ittop 2023. 8. 10. 21:26
반응형

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

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

는 알고 , 저는 으로 reload()를 사용합니다.from app.models import *구문, 그러니까 reload"는 큰 도움이 되지 않습니다.

IPython 자동 재로드 확장을 사용하는 것이 좋습니다.

./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 autoreloadcommand

./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가지 자동 재로드 전략:

%자동 재로드

  • 지금 모든 모듈(%import에서 제외된 모듈 제외)을 자동으로 다시 로드합니다.

%autoreload 0

  • 자동 다시 로드를 비활성화합니다.

%autoreload 1

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

%autoreload 2

  • 입력한 Python 코드를 실행하기 전에 매번 모든 모듈(%import에서 제외된 모듈 제외)을 다시 로드합니다.

%import

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

%import foo

  • 모듈 'foo'를 가져오고 %autoreload 1에 대해 자동 재로드되도록 표시합니다.

%import - foo

  • 모듈이 자동으로 재로드되지 않도록 'foo'로 표시합니다.

일반적으로 이 기능은 제 용도에 적합하지만 몇 가지 문제점이 있습니다.

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

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

python manage.py 쉘 < test.py

따라서 수정하려는 내용이 수정될 때까지 해당 명령을 변경하고 저장한 후 다시 실행할 수 있습니다.

동위밍으로 위와 같은 장고 확장 프로젝트를 사용하는 것을 추천합니다.그러나 'shell_plus' 관리 명령 대신 다음 명령을 사용합니다.

manage.py shell_plus --notebook

그러면 웹 브라우저에서 IPython 노트북이 열립니다.셀에 코드, 가져오기 등을 작성하고 실행합니다.

모듈을 변경할 때 노트북 메뉴 항목 '커널->다시 시작'을 클릭하면 됩니다.

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

경영자를 보다.django-extensions 프로젝트에서 제공하는 py shell_plus 명령입니다.셸 시작 시 모든 모델 파일이 로드됩니다.그리고 모든 수정 사항을 자동으로 다시 로드하지만 종료할 필요는 없습니다. 직접 통화할 수 있습니다.

이 주제에 대한 일반적인 합의는 python reload()가 엉망이고 이를 위한 좋은 방법이 없다는 것입니다.

ipython 구성과 함께 shell_plus를 사용합니다.이 옵션을 사용하면autoreloadshell_plus가 자동으로 가져오기 전에.

pip install django-extensions
pip install ipython
ipython profile create

프로필을 합니다.~/.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또는SHELL_PLUS_POST_IMPORTS()로 자동 다시 로드됩니다!

예:pdb.set_trace()파일을 저장하면 다시 로드하는 데 방해가 될 수 있습니다.

이 불편함에 대한 저의 해결책은 다음과 같습니다.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)

Python 3.x의 경우 다음을 사용하여 'reload'를 가져와야 합니다.

from importlib import reload

도움이 되길 바랍니다.물론 디버그를 위한 것입니다.

건배.

몇 가지 트릭이 없으면 장고 셸에서 다시 로드()가 작동하지 않습니다.이 스레드나와 내 대답을 구체적으로 확인할 수 있습니다.

"manage"를 통해 대화형 인터프리터를 사용하여 장고 모델 모듈을 다시 로드하는 방법.파이 쉘"?

이에 대한 두 가지 답변을 사용하여 간단한 한 줄 접근법을 생각해냈습니다.

django 셸을 -c로 실행하면 전달된 명령을 실행할 수 있지만 코드 실행 후 즉시 종료됩니다.

비결은 필요한 것을 설정하고 코드를 실행하는 것입니다.interact(local=http://() )를 수행한 다음 전달한 코드 내에서 셸을 다시 시작합니다.다음과 같이:

python manage.py shell -c 'import uuid;test="mytestvar";import code;code.interact(local=locals())'

저는 그저 부유한 도서관의 점검 방법을 원했습니다.몇 줄만:

python manage.py shell -c 'import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())'

마지막으로 위에 체리는 가명입니다.

alias djshell='python manage.py shell -c "import code;from rich import pretty;pretty.install();from rich import inspect;code.interact(local=locals())"'

이제 셸을 시작하고 폼 클래스를 검사하려고 하면 다음과 같이 아름다운 출력을 얻을 수 있습니다.

Django 셸에서 명령을 실행하는 대신 관리 명령을 설정하고 매번 다시 실행할 수 있습니다.

정확히 당신이 원하는 것은 아니지만, 저는 이제 시험하고 물건을 만지작거리기 위한 관리 명령을 스스로 구축하는 경향이 있습니다.

명령을 사용하면 원하는 방식으로 로컬 집합을 설정한 후 대화형 셸로 이동할 수 있습니다.

import code

class Command(BaseCommand):
  def handle(self, *args, **kwargs):
     foo = 'bar'
     code.interact(local=locals())

다시 로드는 없지만 장고 기능을 대화식으로 테스트하는 쉽고 덜 성가신 방법입니다.

import test  // test only has x defined
test.x       // prints 3, now add y = 4 in test.py
test.y       // error, test does not have attribute y

솔루션 importlib에서 reload를 다음과 같이 사용합니다.

from importlib import reload
import test // test only has x defined
test.x // prints 3, now add y = 4 in test.py
test.y // error
reload(test)
test.y // prints 4

언급URL : https://stackoverflow.com/questions/3772260/how-to-reload-modules-in-django-shell

반응형