2012-10-31 12 views
18

का उपयोग करते समय मॉड्यूल को दोबारा आयात करना I ipython से प्यार करता है, लेकिन मुझे% रन के साथ एक समस्या मिली है: आयातित मॉड्यूल को फिर से लोड नहीं किया जाता है जब% रन बार-बार कहा जाता है।ipython:% रन

import ex2 
ex2.x.append(1) 
print ex2.x 

और फ़ाइल ex2.py शामिल हैं::

मान लीजिए फ़ाइल ex1.py रेखाएं हों,

x = [] 
अब

, कमांड लाइन से अजगर ex1.py चल बार बार प्रिंट [1] हर बार। लेकिन ipython के भीतर से %run ex1.py का बार-बार प्रिंटिंग [1], [1,1], [1,1,1] इत्यादि का आह्वान करना ऐसा इसलिए है क्योंकि मॉड्यूल ex2.py पुनः लोड नहीं किया गया है। तो हमें एक समस्या है: ipython रन-स्क्रिप्ट प्रोटोकॉल "वास्तविक दुनिया" व्यवहार को प्रतिबिंबित नहीं कर रहा है।

नोट:

%load_ext autoreload 
%autoreload 2 

करता नहीं मदद करते हैं। उन पंक्तियों को ex2.py फिर से लोड किया जाएगा यदि ex2.py फ़ाइल में कोई परिवर्तन किया गया है। अगर हम कोई बदलाव नहीं करते हैं, या केवल ex1.py में परिवर्तन करते हैं, तो हमें अवांछित व्यवहार मिलता है।

क्या% रन कमांड लाइन की तरह व्यवहार करने का कोई तरीका है? यह स्क्रिप्ट के लिए परीक्षण वातावरण के रूप में ipython का उपयोग करने के साथ एक वास्तविक कमी की तरह लगता है। (या शायद नैतिक यह है कि एक मॉड्यूल किसी अन्य मॉड्यूल के नामस्थान में नहीं लिखा जाना चाहिए?)

उत्तर

11

%run ex1.py (या उस मामले के लिए कोई भी स्क्रिप्ट) आपके आयातित मॉड्यूल की गहरी रीलोड नहीं करता है, यहां तक ​​कि ऑटोरेलोड एक्सटेंशन 2 पर सेट किया गया है यह एक "दोष" है कि कैसे %run कमांड ipython में काम करता है।

आप स्पष्ट रूप से %run ex1.py फिर से निष्पादित करने से पहले

dreload(ex2) 
एक गहरी पुनः लोड के लिए

फोन करना होगा।

देखें - http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.deepreload.html

%run भविष्य में स्वचालित रूप से गहरी पुनः लोड कर बनाने की योजना हो सकती है और आप इस मुद्दे, जो अभी भी लेखन के इस समय में एक खुला मुद्दा है पा सकते हैं, यहाँ एक उपयोगकर्ता ने सुझाव दिया जा रहा है - https://github.com/ipython/ipython/issues/461

6

मुझे एक ही समस्या का सामना करना पड़ रहा है। ऐसा लगता है कि यह ipython के रन कमांड का एक अवांछनीय प्रभाव है - यह आयातित मॉड्यूल को पुनः लोड नहीं करता है।

लेखक सही है: परिवर्तन ex2.py करने के लिए बनाया गया है, तो निम्न आदेश में मदद मिलेगी फिर से लोड

%load_ext autoreload 
%autoreload 2 

मेरे सबसे सरल चारों ओर पाने के लिए जिस तरह से किया जाता है करने के लिए (संशोधित आयातित मॉड्यूल इस उदाहरण में , ex2.py) प्रत्येक बार, और ipython

%load_ext autoreload 
%autoreload 2 
%run ex1.py 

में निम्न आदेश निष्पादित करें यह ex2.py को पुनः लोड करने में मदद करता है।

ध्यान दें कि उपरोक्त 3 पंक्तियों को निष्पादित करने से पहले प्रत्येक बार ex2.py को संशोधित किया जाना चाहिए। यह केवल इस तरह से मॉड्यूल ex2 पुनः लोड किया जा सकता है।