दिलचस्प पोस्ट
एचटीएमएल फॉर्म एक्शन और ऑनसबमिट इश्यू सी में लिनक्स के साथ साझा मेमोरी का उपयोग कैसे करें स्वचालित अर्धविराम सम्मिलन और रिटर्न बयानों क्या यह सच है कि उत्पादन कोड पर एनएसएलॉग () का उपयोग नहीं करना चाहिए? कैसे प्लगइन और सभी तीसरे पक्ष की सुविधा के बिना दृश्य स्टूडियो को चलाने के लिए क्यों तार्किक ऑपरेटरों (&& और ||) हमेशा एक बूलियन परिणाम नहीं लौटाते हैं? सरल खोजकर्ता ऐडैप्टर और कंसल लोडर के लिए विस्तार योग्य LISTView मैं एंड्रॉइड डिवाइस से लॉगफ़ाइल कैसे प्राप्त करूं? क्या प्रोग्रामेटिक रूप से JAXB को कॉन्फ़िगर करना संभव है? जावास्क्रिप्ट में Java / Servlet / JSP / JSTL / EL चर का उपयोग करें अजगर पांडा: एक श्रृंखला के लिए तर्क के साथ एक फ़ंक्शन लागू करें ऐसी फाइल लोड नहीं कर सकता – रेलवे पर रूबी पर sqlite3 / sqlite3_native (लोड इरर) किसी सर्वर पर एक छवि के रूप में एक HTML5 कैनवास कैसे सहेज सकता है? एचडब्ल्यू त्वरित गतिविधि – ओपनजीएल बनावट आकार की सीमा कैसे प्राप्त करें? वर्ग PLBuildVersion दोनों चौखटे में कार्यान्वित किया गया है

मैं एक पायथन मॉड्यूल को कैसे लोड करूँ?

मेरे पास एक लंबे समय से चलने वाला पायथन सर्वर है और सर्वर को पुनरारंभ किए बिना सेवा को अपग्रेड करने में सक्षम होना चाहते हैं। यह सबसे अच्छा तरीका क्या है?

if foo.py has changed: unimport foo <-- How do I do this? import foo myfoo = foo.Foo() 

वेब के समाधान से एकत्रित समाधान "मैं एक पायथन मॉड्यूल को कैसे लोड करूँ?"

आप पायथन 2 में reload से reload किए गए फ़ंक्शन का उपयोग करके एक मॉड्यूल पुनः लोड कर सकते हैं:

 import foo while True: # Do some things. if is_changed(foo): foo = reload(foo) 

पायथन 3 में, reload imp मॉड्यूल में ले जाया गया था। 3.4 में, imp importlib पक्ष में बहिष्कृत किया गया था, और reload बाद में जोड़ा गया था। जब 3 या बाद के लक्ष्य को लक्षित किया जाता है, तो उचित मॉड्यूल को reload या आयात करते समय संदर्भ देता है

मुझे लगता है कि आप यही चाहते हैं वेब सर्वर जैसे डीजेंगो के डेवलपमेंट सर्वर इस का उपयोग करते हैं ताकि आप सर्वर की प्रक्रिया को पुनरारंभ किए बिना अपने कोड परिवर्तन के प्रभाव देख सकें।

डॉक्स से उद्धृत करने के लिए:

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

जैसा कि आपने अपने प्रश्न में उल्लेख किया है, आपको Foo ऑब्जेक्ट्स को फिर से संगठित करना होगा यदि Foo क्लास Foo मॉड्यूल में रहता है।

पायथन 3.0-3.3 में आप उपयोग करेंगे: imp.reload(module)

बीडीएफएल ने इस प्रश्न का उत्तर दिया है।

हालांकि, importlib को 3.4 में importlib किया गया था, importlib पक्ष में (धन्यवाद @ स्टाफ़न! )।

मुझे लगता है , इसलिए, अब आप importlib.reload(module) उपयोग करते हैं, हालांकि मुझे यकीन नहीं है।

यह विशेष रूप से एक मॉड्यूल को हटाना कठिन हो सकता है यदि यह शुद्ध पायथन नहीं है।

यहां से कुछ जानकारी दी गई है: मैं वास्तव में आयातित मॉड्यूल को कैसे हटाऊं?

संदर्भों की वास्तविक संख्या जानने के लिए आप sys.getrefcount () का उपयोग कर सकते हैं।

 >>> import sys, empty, os >>> sys.getrefcount(sys) 9 >>> sys.getrefcount(os) 6 >>> sys.getrefcount(empty) 3 

3 से अधिक संख्या से संकेत मिलता है कि मॉड्यूल से छुटकारा पाना मुश्किल होगा। घर के बाहर "खाली" (कुछ नहीं) मॉड्यूल के बाद एकत्र कचरा होना चाहिए

 >>> del sys.modules["empty"] >>> del empty 

जैसा कि तीसरे संदर्भ getrefcount () फ़ंक्शन के एक कलाकृति है

reload(module) , लेकिन केवल अगर यह पूरी तरह से अकेला है यदि किसी और चीज़ के लिए मॉड्यूल (या मॉड्यूल से संबंधित किसी भी ऑब्जेक्ट) का कोई संदर्भ है, तो आपको पुरानी कोड की वजह से आपके द्वारा अपेक्षा से अधिक लंबे समय तक फांसी के कारण सूक्ष्म और जिज्ञासु त्रुटियां isinstance , और जैसी चीजें अलग-अलग संस्करणों में काम नहीं कर रही हैं एक ही कोड

यदि आपके पास एक तरह से निर्भरताएं हैं, तो आपको पुराने मॉडलों के सभी संदर्भों को छुटकारा पाने के लिए पुनः लोड किए गए मॉड्यूल पर निर्भर सभी मॉड्यूल पुनः लोड करना होगा। और फिर पुनः लोड मॉड्यूल पर निर्भर मॉड्यूल पुनः लोड, recursively

यदि आपके पास परिपत्र निर्भरता है, जो कि उदाहरण के लिए बहुत सामान्य है जब आप किसी पैकेज को पुनः लोड करने के साथ काम कर रहे हैं, तो आपको एक बार में समूह के सभी मॉड्यूल को अनलोड करना होगा। आप इसे reload() साथ नहीं कर सकते क्योंकि इससे प्रत्येक निर्भरता को ताज़ा करने से पहले प्रत्येक मॉड्यूल को फिर से आयात किया जा सकता है, पुराने संदर्भों को नए मॉड्यूल में रेंगने की इजाजत देता है।

इस मामले में ऐसा करने का एकमात्र तरीका है sys.modules हैक, जो कि असमर्थित है आपको प्रत्येक sys.modules प्रविष्टि के माध्यम से जाना और हटाना होगा, sys.modules आप अगली आयात पर पुनः लोड करना चाहते थे, और उन प्रविष्टियों को भी हटाएं जिनके मूल्य कैशिंग के साथ करने के लिए एक कार्यान्वयन के मुद्दे से निपटने के लिए None है असफल रिश्तेदार आयात यह बहुत अच्छा नहीं है, लेकिन जब तक आपके पास पूर्णत: आत्मनिर्भर निर्भरता का सेट होता है जो इसके कोडबेस के बाहर संदर्भ नहीं छोड़ता है, यह कार्यशील है

सर्वर को पुनरारंभ करना संभवतः सबसे अच्छा है 🙂

 if 'myModule' in sys.modules: del sys.modules["myModule"] 

पायथन 2 के लिए अंतर्निर्मित फ़ंक्शन पुनः लोड करें () :

 reload(module) 

पायथन 2 और 3.2-3.3 के लिए मॉड्यूल प्रति से पुनः लोड का उपयोग करें:

 import imp imp.reload(module) 

लेकिन आयात को संस्करण 3.4 से आयात लिब के पक्ष में पदावनत किया गया है , इसलिए उपयोग करें:

 import importlib importlib.reload(module) 

या

 from importlib import reload reload(module) 

निम्नलिखित कोड आपको Python 2/3 संगतता की अनुमति देता है:

 try: reload except NameError: # Python 3 from imp import reload 

आप इसे दोनों संस्करणों में reload() रूप में उपयोग कर सकते हैं जो चीज़ों को सरल बनाता है

स्वीकृत जवाब एक्स आयात वाई केस से नहीं होता है। यह कोड इसे और मानक आयात के मामले को भी संभालता है:

 def importOrReload(module_name, *names): import sys if module_name in sys.modules: reload(sys.modules[module_name]) else: __import__(module_name, fromlist=names) for name in names: globals()[name] = getattr(sys.modules[module_name], name) # use instead of: from dfly_parser import parseMessages importOrReload("dfly_parser", "parseMessages") 

पुनः लोड करने के मामले में, हम शीर्ष स्तर के नामों को नए पुन: लोड किए गए मॉड्यूल में संग्रहीत मानों को पुन: असाइन करते हैं, जो उन्हें अद्यतन करता है।

मेरे जैसे उन सभी मॉड्यूलों को अनलोड करना चाहते हैं (जब एमैक्स के तहत पायथन इंटरप्रेटर में चलते हैं):

  for mod in sys.modules.values(): reload(mod) 

अधिक जानकारी पायथन मॉड्यूल को पुनः लोड करने में है।

इनथेट वैल्यू में मॉड्यूल है जो इस के लिए काफी अच्छा काम करता है। https://traits.readthedocs.org/en/4.3.0/_modules/traits/util/refresh.html

यह उस मॉड्यूल को फिर से लोड करेगा जिसे बदल दिया गया है, और अन्य मॉड्यूल और इंस्टेंट ऑब्जेक्ट्स को अपडेट कर रहा है जो इसे प्रयोग कर रहे हैं। यह __very_private__ विधियों के साथ __very_private__ समय काम नहीं करता है, और वर्ग उत्तराधिकार पर दम घुट सकती है, लेकिन यह PyQt guis, या माया या Nuke जैसे कार्यक्रमों में चलाए जाने वाले सामान लिखते समय मेजबान अनुप्रयोग को पुनरारंभ करने से मुझे समय की पागल मात्रा बचाता है । यह शायद समय के 20-30% काम नहीं करता है, लेकिन यह अभी भी अविश्वसनीय सहायक है।

इन्थॉफ़्ट के पैकेज वे क्षणों को बदलते समय फ़ाइलों को फिर से लोड नहीं करते हैं – आपको इसे स्पष्ट रूप से कॉल करना है – लेकिन आपको इसे वास्तव में जरूरी करने के लिए सभी कठिन कार्य नहीं करना चाहिए

अबाकस के मामले में मेरे लिए यह काम करता है। कल्पना कीजिए कि आपकी फ़ाइल क्लास_वेट्टीसएडिटज़ है

 sys.path.append('D:\...\My Pythons') if 'Class_VerticesEdges' in sys.modules: del sys.modules['Class_VerticesEdges'] print 'old module Class_VerticesEdges deleted' from Class_VerticesEdges import * reload(sys.modules['Class_VerticesEdges']) 

यह एक मॉड्यूल को पुनः लोड करने का आधुनिक तरीका है:

 # Reload A Module def modulereload(modulename): import importlib importlib.reload(modulename) 

बस modulereload(MODULE_NAME) टाइप करें, MODULE_NAME को उस मॉड्यूल के नाम से बदल MODULE_NAME , MODULE_NAME आप पुनः लोड करना चाहते हैं।

उदाहरण के लिए, modulereload(math) गणित फ़ंक्शन को पुनः लोड करेगा।

मुझे सब्लाइम पाठ में कुछ पुनः लोड करने की कोशिश में बहुत परेशानी हुई, लेकिन अंत में मैं कोड के आधार पर उत्कृष्टतम टेक्स्ट पर मॉड्यूल को पुनः लोड करने के लिए इस उपयोगिता को लिखा हो सकता है sublime_plugin.py मॉड्यूल को पुनः लोड करने के लिए उपयोग करता है।

यह नीचे आपको उनके नाम पर रिक्त स्थान के साथ पथ से मॉड्यूल पुनः लोड करने के लिए स्वीकार करता है, फिर बाद में पुनः लोड करने के बाद आप आमतौर पर जितनी आम तौर पर आयात कर सकते हैं।

 def reload_module(full_module_name): """ Assuming the folder `full_module_name` is a folder inside some folder on the python sys.path, for example, sys.path as `C:/`, and you are inside the folder `C:/Path With Spaces` on the file `C:/Path With Spaces/main.py` and want to re-import some files on the folder `C:/Path With Spaces/tests` @param full_module_name the relative full path to the module file you want to reload from a folder on the python `sys.path` """ import imp import sys import importlib if full_module_name in sys.modules: module_object = sys.modules[full_module_name] module_object = imp.reload( module_object ) else: importlib.import_module( full_module_name ) def run_tests(): print( "\n\n" ) reload_module( "Path With Spaces.tests.semantic_linefeed_unit_tests" ) reload_module( "Path With Spaces.tests.semantic_linefeed_manual_tests" ) from .tests import semantic_linefeed_unit_tests from .tests import semantic_linefeed_manual_tests semantic_linefeed_unit_tests.run_unit_tests() semantic_linefeed_manual_tests.run_manual_tests() if __name__ == "__main__": run_tests() 

यदि आप पहली बार चलाते हैं, तो इसे मॉड्यूल लोड करना चाहिए, लेकिन यदि बाद में आप विधि / फ़ंक्शन run_tests() कर सकते हैं तो यह परीक्षण फ़ाइलों को पुनः लोड करेगा सब्लाइम टेक्स्ट ( Python 3.3.6 ) के साथ यह बहुत कुछ होता है क्योंकि इसका इंटरप्रेटर कभी बंद नहीं करता (जब तक कि आप सब्लाइम टेक्स्ट को पुनरारंभ न करें, यानी, Python3.3 इंटरप्रेटर)।

एक फ़ंक्शन में मॉड्यूल को आयात करने का दूसरा तरीका हो सकता है। इस तरह जब फ़ंक्शन पूरा होता है तो मॉड्यूल कचरा एकत्रित हो जाता है।