2010-10-07 16 views
5

में पुनः लोड फ़ंक्शन मैं django IPython-shell में काम करता हूं, जिसे manage.py shell से शुरू किया जा सकता है। जब मैं परीक्षण के लिए खोल में एक बाहरी फ़ंक्शन लोड करता हूं, तो सब कुछ ठीक है। लेकिन जब मैं फ़ंक्शन में परिवर्तन करता हूं, तो शैल में अभी भी फ़ंक्शन का पुराना संस्करण होता है। भले ही मैं एक नया आयात करता हूं।django, पायथन: खोल

क्या कोई जानता है कि फ़ंक्शन के वास्तविक संस्करण को फिर से लोड कैसे करें?

धन्यवाद में धन्यवाद!

संपादित करें: मैं विंडोज का उपयोग करता हूं - अगर इससे कोई फर्क पड़ता है।

+1

रीलोड फ़ंक्शन django के साथ काम नहीं करेगा। देखें: http://stackoverflow.com/questions/890924/how-do-you-reload-a-django-model- मॉड्यूल-using-the-interactive-interpreter-via-ma – Hovis

उत्तर

5

मैं द्वारा यह sys.modules से निकालकर एक नया आयात कर मॉड्यूल लोड करें।

import sys 
sys.modules.pop('your.module') 
import your.module 
# or 
from your.module import your_function 
0

मैं एक script कि IPython में मॉड्यूल को पुन: लोड के लिए बहुत अच्छी तरह से काम करता है लिखा था।

यह wrongite's answer above में तकनीक पर आधारित है जहां आप sys.modules से मॉड्यूल को हटाते हैं और फिर इसे पुनः आयात करते हैं।

0

मुझे मिला सबसे आसान समाधान shell_plus और iPython का संयोजन है जो स्वचालित रूप से कार्यों को पुनः लोड करता है।

  1. पिप स्थापित IPython
  2. अपने INSTALLED_APPS को पिप
  3. जोड़ें 'django_extensions' स्थापित Django-एक्सटेंशन
  4. अजगर manage.py shell_plus
+0

यह नहीं करता है मेरे लिए पुनः लोड करें। पायथन 2.6, 2.7, 3.4, 3.5, Django 1.6, 1.7, 1.8, 1.9, 1.10। Django एक्सटेंशन के साथ OFC स्थापित। – Sassan

1

किसी भी कोड आयात करने से पहले IPython autoreload एक्सटेंशन सक्षम करें:

%load_ext autoreload 
%autoreload 2 

मैं नियमित रूप से Django खोल के साथ उपयोग करें और यह पूरी तरह से काम करता है, हालांकि यह कुछ सीमाएं होती हैं:

चेतावनियां:

एक विश्वसनीय तरीके से

पुन: लोड अजगर मॉड्यूल सामान्य रूप में मुश्किल है, और अप्रत्याशित बातों हो सकता है । % autoreload नए संस्करणों के साथ मॉड्यूल में फ़ंक्शन कोड ऑब्जेक्ट्स और कक्षाओं के हिस्सों को प्रतिस्थापित करके सामान्य नुकसान के आसपास काम करने की कोशिश करता है। यह निम्नलिखित चीजों को काम करने के लिए बनाता है:

  • 'xxx आयात foo से' के माध्यम से आयात किए गए कार्यों और वर्गों को 'xxx' पुनः लोड होने पर नए संस्करणों में अपग्रेड किया गया है।
  • कक्षाओं के तरीके और गुणों को पुनः लोड पर अपग्रेड किया गया है, ताकि पुनः लोड करने से पहले बनाए गए किसी ऑब्जेक्ट 'c' पर 'c.foo()' को कॉल करने से 'foo' निष्पादित करने के लिए नया कोड होता है।

जाना जाता शेष चेतावनियां से कुछ हैं:

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

स्रोत:। https://ipython.org/ipython-doc/3/config/extensions/autoreload.html#caveats

एक और बढ़िया विकल्प की तरह, एक अलग लिपि में अपने कोड लिखने और खोल django को भेजने के लिए है यह:

manage.py shell < my_script.py