2009-11-29 14 views
7

में एक बदली गई पायथन फ़ाइल को फिर से लोड करना emacs में पायथन शेल (मैं चल रहा हूं 2. * पायथन) मैं एक .py फ़ाइल आयात कर रहा हूं, मैं कोड के साथ काम कर रहा हूं और परीक्षण कर रहा हूं। अगर मैं कोड बदलता हूं तो मुझे यकीन नहीं है कि इसे फिर से आयात कैसे किया जाए।emacs python shell

मेरे पढ़ने से अब तक ऐसा लगता है कि

reload(modulename) 

काम करना चाहिए, लेकिन यह प्रतीत नहीं होता है।

शायद सिर्फ पाइथन खोल को बंद करना और इसे पुनरारंभ करना पर्याप्त होगा, क्या इसके लिए कोई आदेश है या आप इसे मैन्युअल रूप से करते हैं?

संपादित करें: ऐसा लगता है कि पाइथन-सेंड-डिफुन और पायथन-सेंड-बफर आदर्श होगा, लेकिन परिवर्तन प्रचारित प्रतीत नहीं होते हैं।

उत्तर

5

यह मेरे लिए काम करने के लिए लगता है:

एक फ़ाइल बनाएँ (अपने PYTHONPATH में) कहा जाता test.py

def foo(): 
    print('bar') 

तो Emacs अजगर खोल (या बेहतर अभी तक, IPython खोल) में, टाइप

>>> import test 
>>> test.foo() 
bar 

अब संशोधित test.py:

def foo(): 
    print('baz') 

>>> reload(test) 
<module 'test' from '/home/unutbu/pybin/test.py'> 
>>> test.foo() 
baz 
+0

धन्यवाद यह अब पूरी तरह से काम करता है, मैं कुछ अजीब कर रहा होगा। – justinhj

+0

ध्यान दें कि उपलब्ध होने पर .pyc फ़ाइलों से पुनः लोड करना पसंद करेंगे। तो यदि आप कोई परिवर्तन करते हैं लेकिन पीईसी फाइलों को पुनर्निर्मित या हटाया नहीं जाता है, तो आपका परिवर्तन शैल में दिखाई नहीं देगा। – rogueleaderr

+0

सीपीथॉन में, 'रीलोड' स्वचालित रूप से स्रोत फ़ाइल को फिर से पढ़ता है यदि स्रोत फ़ाइल .pyc फ़ाइल से नई है। मैं इसे दस्तावेज़ में अभी नहीं ढूंढ सकता, लेकिन इसे आजमाएं - यह काम करता है। – unutbu

15

जबकि reload() काम करता है, यह कक्षाओं, कार्यों और अन्य वस्तुओं के संदर्भों को नहीं बदलता है, इसलिए पुराने संस्करण को देखना आसान है। को exec (जिसका अर्थ है कि पहले स्थान पर import का उपयोग नहीं करना) या पूरी तरह से दुभाषिया को पुनरारंभ करना है, का सबसे संगत समाधान reload() को प्रतिस्थापित करना है।

यदि आप पुनः लोड का उपयोग जारी रखना चाहते हैं, तो इस मॉड्यूल से चीजों का संदर्भ कैसे लें, और हमेशा पूर्ण नाम का उपयोग करने के बारे में बहुत सावधान रहें। जैसे import module और from module import name के बजाय module.name का उपयोग करें। और, यहां तक ​​कि सावधान रहना, आप अभी भी पुरानी वस्तुओं के साथ समस्याओं में भाग लेंगे, जो एक कारण है reload() 3.x में नहीं है।

+1

इस टिप्पणी में महत्वपूर्ण बात यह है कि आप न केवल मॉड्यूल को फिर से लोड करने के लिए है, लेकिन यह भी कि है 'नया' मॉड्यूल – Jehiah

+3

के आधार पर ऑब्जेक्ट को फिर से चालू करने के लिए बस आप कैसे आयात करते हैं यह तय करना सामान्य मामले में पुनः लोड करने का काम नहीं करेगा। यदि आपने आयातित मॉड्यूल (उदाहरण के लिए क्लास इंस्टेंस) से कुछ भी संग्रहीत किया है, तो इसे पुनः लोड नहीं किया जाएगा। सामान्य रूप से पुनः लोड करने के लिए, आपको अपने सभी उपयोगकर्ताओं को पुनः लोड करना होगा। रीलोड भंगुर है, और परीक्षण करते समय मैं इसका उपयोग करने की दृढ़ता से अनुशंसा करता हूं - आखिरी चीज जिसे किसी को डिबगिंग करना आंशिक रीलोड द्वारा थोड़ा सा होना चाहिए, जिससे आप रहस्य को फिर से शुरू करते समय दूर जाने वाली रहस्यमय बग की ओर अग्रसर होते हैं। –

0

काफी समय के लिए इस मुद्दे को देखने के बाद, मैं इस निष्कर्ष पर पहुंचा कि लागू करने का सबसे अच्छा समाधान या तो आपके पायथन दुभाषिया (उदाहरण के लिए ipython) की प्रारंभिक फ़ाइल पर आधारित है, या अजगर निर्माण- मॉड्यूल में "आईपी" और इसका कार्य "पुनः लोड"।

import my_module 
import imp 
imp.reload(my_module) 

#your code 

यह समाधान इस पेज से मेरे पास आया: अपने कोड की शुरुआत में उदाहरण के लिए https://emacs.stackexchange.com/questions/13476/how-to-force-a-python-shell-to-re-import-modules-when-running-a-buffer