कैसे django खोल में मॉड्यूल फिर से लोड करने के लिए?


90

मैं Django के साथ काम कर रहा हूं और हर समय Django शेल का उपयोग करता हूं। कष्टप्रद हिस्सा यह है कि जब Django सर्वर कोड परिवर्तन पर पुनः लोड करता है, तो शेल नहीं होता है, इसलिए हर बार जब मैं परीक्षण कर रहा हूं, तो मुझे एक विधि में बदलाव करना होगा, मुझे शेल को छोड़ना होगा और इसे फिर से शुरू करना होगा, सभी मॉड्यूलों को फिर से आयात करना होगा जरूरत है, मैं अपनी जरूरत के सभी चरों को पुन: स्थापित करूं, जबकि iPython इतिहास इस पर बहुत कुछ लिखता है, यह अभी भी एक दर्द है। वहाँ django खोल ऑटो पुनः लोड करने का एक तरीका है, उसी तरह django विकास सर्वर करता है?

मैं पुनः लोड () के बारे में जानता हूं, लेकिन मैं बहुत सारे मॉडल आयात करता हूं और आम तौर पर from app.models import *सिंटैक्स का उपयोग करता हूं , इसलिए फिर से लोड करना () ज्यादा मदद नहीं करता है।


2
आपको "django-extension" उत्तर को सही चिह्नित करने के लिए इस प्रश्न को अपडेट करना चाहिए।
वुडार्डज

1
तब तक नहीं जब तक यह वास्तव में मेरे लिए काम न करे। मेरे पास एक्सटेंशन स्थापित हैं और मेरा कोई भी कोड ऑटो-रीलोड नहीं है और मुझे शेल_प्लस डॉक्स में ऑटो-लोडिंग का कोई उल्लेख नहीं दिखता है। ऐसा लगता है कि runserver_plus कमांड में एक रीलोडर है, लेकिन वह नहीं है जो मैं देख रहा हूं।
मैड वॉम्बैट

जवाबों:


37

मैं django- एक्सटेंशन परियोजना का उपयोग करने की सलाह देता हूं, जैसे डोंग्वीमिंग द्वारा। लेकिन सिर्फ 'शेल_प्लस' प्रबंधन आदेश के बजाय, उपयोग करें:

manage.py shell_plus --notebook

यह आपके वेब ब्राउज़र पर एक IPython नोटबुक खोलेगा। वहां एक सेल, अपने इंपोर्ट आदि में अपना कोड लिखें और उसे चलाएं।

जब आप अपने मॉड्यूल बदलते हैं, तो बस नोटबुक मेनू आइटम 'कर्नेल-> पुनरारंभ करें' पर क्लिक करें

वहां आप जाते हैं, आपका कोड अब आपके संशोधित मॉड्यूल का उपयोग कर रहा है।


30
"बस एक अजगर नोटबुक का उपयोग करें" ओपी के सवाल का जवाब नहीं है।
J__

यह विधि% ऑटोरेलोड की तरह स्वचालित नहीं है, जबकि ऑटोरिलैड की तुलना में अधिक मज़बूती से काम करता है। कर्नेल रीस्टार्ट यह गारंटी देता है कि नोटबुक में सभी सेल पूरी तरह से पुनः लोड किए गए मॉड्यूल हैं। साथ ही यदि आप चुनते हैं तो आप सभी कक्षों को पुनरारंभ और चला सकते हैं।
एंटोन आई। सिपोस

72

मेरा सुझाव है कि 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

  • सभी मॉड्यूल को पुन: लोड करें (सिवाय उन लोगों को छोड़कर, जिनका%% मासपोर्ट) अब स्वचालित रूप से है।

% ऑटोरेलोड 0

  • स्वचालित पुनः लोड करना अक्षम करें।

% ऑटोरेलोड 1

  • पायथन कोड को निष्पादित करने से पहले हर बार% aimport के साथ आयातित सभी मॉड्यूल पुनः लोड करें।

% ऑटोरेलोड 2

  • पायथन कोड को निष्पादित करने से पहले हर बार सभी मॉड्यूल (% उद्देश्य से बाहर रखे गए लोगों को छोड़कर) को फिर से लोड करें।

% aimport

  • सूची मॉड्यूल जिन्हें स्वचालित रूप से आयात किया जाना है या आयात नहीं किया जाना है।

% टस टप फ

  • इंपोर्ट मॉड्यूल 'फू' और इसे% ऑटोरैलोएड 1 के लिए ऑटोरेलिड होने के लिए चिह्नित करें

% उद्देश्य -फू

  • मार्क मॉड्यूल 'फू' को ऑटोरेलिड नहीं होना चाहिए।

यह आमतौर पर मेरे उपयोग के लिए अच्छा काम करता है, लेकिन कुछ गुफाएं हैं:

  • कोड ऑब्जेक्ट्स को प्रतिस्थापित करना हमेशा सफल नहीं होता है: क्लास में @property को साधारण विधि या सदस्य चर के लिए विधि में बदलने से समस्याएँ उत्पन्न हो सकती हैं (केवल पुरानी वस्तुओं में)।
  • हटाए जाने से पहले एक मॉड्यूल से हटाए गए कार्य (जैसे बंदर-पैचिंग के माध्यम से) को अपग्रेड नहीं किया जाता है।
  • C एक्सटेंशन मॉड्यूल को फिर से लोड नहीं किया जा सकता है, और इसलिए इसे ऑटोरेलिड नहीं किया जा सकता है।

3
मामले में आप django का उपयोग कर रहे हैं /manage.py shell_plus... यदि आप टाइप करते हैं %load_ext autoreloadऔर फिर %autoreload 2, मॉडल स्वचालित रूप से पुनः लोड हो जाएंगे।
फ्यूजन

कमाल है, आपने मेरा दिन बना दिया
शम्सुल आरिफिन साजिब

ध्यान दें कि आपको इसके लिए ipython स्थापित करने की आवश्यकता है, जाहिर है। उदाहरण के लिए देखें stackoverflow.com/a/47170195/50899
Rabarberski

38

django- एक्सटेंशन प्रोजेक्ट द्वारा प्रदान किए गए manage.py shell_plus कमांड को देखें । यह शेल स्टार्टअप पर आपकी सभी मॉडल फ़ाइलों को लोड करेगा। और अपने किसी भी संशोधन को ऑटोरेलोड करें लेकिन निकास की आवश्यकता नहीं है, आप वहां कॉल कर सकते हैं


40
मैं शेल_प्लस का उपयोग करता हूं और मेरे मॉडल ऑटो-लोडिंग नहीं हैं, क्या मैं कुछ याद कर रहा हूं?
डिएगो पोंचियानो

30
shell_plus मॉडल को फिर से लोड नहीं करता है, इसलिए यह सवाल का जवाब नहीं देता है।
०३

5
जैसा कि कहा गया है, shell_plus मॉडल को फिर से लोड नहीं करता है।
zenperttu

2
शायद मुझे कुछ याद आ रहा है, लेकिन शेल_प्लस मेरे लिए कुछ भी पुनः लोड नहीं करता है। यह स्टार्टअप पर सभी मॉडलों को लोड करता है, जो सुविधाजनक है, लेकिन यह वह है।
मैड वॉम्बैट 21

14
शेल_प्लस ऑटोरेलोड मॉड्यूल का उपयोग करके मॉड्यूल को फिर से लोड कर सकता है। टाइप करें '% load_ext ऑटोरैलोएड' और फिर '% ऑटोरेलोड 2' - देखें ipython.org/ipython-doc/3/config/extensions/autoreload.html
bbrame

37

इसका समाधान यह है कि मैं कोड लिखूं और किसी फाइल में सेव करूं और फिर उपयोग करूं:

python manage.py शेल <test.py

इसलिए मैं उस कमांड को फिर से बदल सकता हूं, बचा सकता हूं और चला सकता हूं जब तक कि मैं जो भी ठीक करने की कोशिश कर रहा हूं उसे ठीक कर दूं।


2
अच्छा और सरल। एक नोट, exit()एक क्लीनर फैशन में Django खोल से बाहर निकलने के लिए पाई फ़ाइल के नीचे जोड़ें । धन्यवाद।
मार्क

सरल और सुरुचिपूर्ण समाधान। बहुत बढ़िया।
निकोसिप

25

ऐसा लगता है कि इस विषय पर आम सहमति है, अजगर रिलोड () चूसता है और ऐसा करने का कोई अच्छा तरीका नहीं है।


गलत। @ ऊपर डोंग्विमिंग का उत्तर समाधान है, और इसे सर्वश्रेष्ठ उत्तर के रूप में स्वीकार किया जाना चाहिए।
जोसेफ शेडी

3
उनके जवाब पर कई टिप्पणियां कहती हैं कि शेल_प्लस
मैड

1
मैंने अभी खुद इसका परीक्षण किया है और यह पुनः लोड नहीं करता है। इसके अलावा, गैर-मॉडल कोड के बारे में क्या मैं हाथ से आयात करता हूं?
मैड वॉम्बैट

एक ऐप में जिन कक्षाओं का उपयोग कर रहा हूं, वे अब एक महान नॉन-डेजैंगो-मॉडल मॉड्यूल और इसके भीतर की कक्षा सहित, महान (पायथन 3.4.3, Django 1.9b1, django-Extension 1.5.9) को पुनः लोड कर रहे हैं। इस जवाब के 5 साल हो गए हैं, और बहुत विकास हुआ है।
जोसेफ शेडी

1
मैंने इसे 40 मिनट पहले अपने सेटअप पर आज़माया है और शेल_प्लस मेरे लिए कुछ भी पुनः लोड नहीं करता है। Django 1.7.10, अजगर 3.4.3, django- एक्सटेंशन 1.5.9।
मैड वॉम्बैट

5

रीलोडेड () कुछ ट्रिक्स के बिना Django शेल में काम नहीं करता है। आप इस धागे को और मेरे उत्तर को विशेष रूप से देख सकते हैं:

आप "प्रबंधन ओरेकल शेल" के माध्यम से इंटरएक्टिव इंटरप्रेटर का उपयोग करके एक Django मॉडल मॉड्यूल को कैसे पुनः लोड करते हैं?


5

इस असुविधा के लिए मेरा समाधान इस प्रकार है। मैं 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 , 'Reload' का उपयोग कर आयात किया जाना चाहिए:

from importlib import reload

आशा करता हूँ की ये काम करेगा। बेशक यह डिबग उद्देश्यों के लिए है।

चीयर्स।


2

एक ipython config के साथ shell_plus का प्रयोग करें । यह autoreloadपहले से ही कुछ भी आयात करने से पहले शेल_प्लस को सक्षम करेगा ।

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या SHELL_PLUS_POST_IMPORTS( डॉक्स ) में परिभाषित कुछ भी ऑटोरेलैड होगा!

ध्यान दें कि यदि pdb.set_trace()कोई फ़ाइल सहेजते समय आपका शेल डिबगर (पूर्व ) में है तो यह पुनः लोड में हस्तक्षेप कर सकता है।


1
जवाब के लिए धन्यवाद। आप इस पर ध्यान दे सकते हैं, क्योंकि मैंने इसे 2010 में पूछा था। मुझे यह जानकर खुशी हुई कि आठ साल के बाद ऑटो-रीलोड आखिरकार शेल_प्लस में काम करता है :)
मैड

1

Django शेल से कमांड चलाने के बजाय, आप प्रत्येक बार ऐसा और फिर से दौड़ने जैसा एक प्रबंधन कमांड सेट कर सकते हैं ।


0

ठीक वैसा नहीं जैसा आप चाहते हैं, लेकिन मैं अब चीजों के साथ परीक्षण और फ़िदालिंग के लिए अपने आप को प्रबंधन आदेश बनाने की प्रवृत्ति रखता हूं।

कमांड में आप स्थानीय लोगों का एक समूह सेट कर सकते हैं जिस तरह से आप चाहते हैं और बाद में एक इंटरैक्टिव शेल में छोड़ दें।

import code

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

कोई पुनः लोड नहीं है, लेकिन django कार्यक्षमता का परीक्षण करने के लिए एक आसान और कम कष्टप्रद तरीका है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.