पाइथन में आईपीथॉन के साथ एक बड़ी परियोजना (कई फाइलों और फ़ोल्डर्स में विभाजित) विकसित करते समय, मैं कैश किए गए आयातित मॉड्यूल की परेशानी में भाग लेता हूं।आयातित मॉड्यूल को कैशिंग करने से पाइथन को रोकें
समस्या यह है कि निर्देश import module
केवल मॉड्यूल को बदलता है, भले ही वह मॉड्यूल बदल गया हो! इसलिए हर बार जब मैं अपने पैकेज में कुछ बदलता हूं, तो मुझे आईपीथन छोड़ना और पुनरारंभ करना होगा। दर्दनाक।
क्या कुछ मॉड्यूल को पुनः लोड करने के लिए सही तरीके से बल देने का कोई तरीका है? या, बेहतर, किसी भी तरह से पाइथन उन्हें कैशिंग से रोकने के लिए?
मैंने कई दृष्टिकोणों की कोशिश की, लेकिन कोई भी काम नहीं करता है। विशेष रूप से मैं वास्तव में अजीब बग्स चलाता हूं, जैसे कि कुछ मॉड्यूल या वेरिएबल्स रहस्यमय रूप से None
के बराबर बन रहे हैं ...
मुझे पाया गया एकमात्र समझदार संसाधन Reloading Python modules है, लेकिन मैंने इसे चेक नहीं किया है। मुझे ऐसा कुछ चाहिए।
आईपीथॉन को पुनरारंभ करने के लिए एक अच्छा विकल्प होगा, या किसी भी तरह पाइथन दुभाषिया को पुनरारंभ करें।
तो, यदि आप पाइथन में विकसित होते हैं, तो आपको इस समस्या का क्या समाधान मिला है?
संपादित
बातें स्पष्ट करने के लिए: जाहिर है, मैं समझता हूँ कि कुछ पुराने मॉड्यूल के पहले वाली स्थिति पर निर्भर करता है चर पर रुकने सकता है। मेरी तरफ से ठीक है। पाइथन में इतनी मुश्किल क्यों है कि बिना किसी अजीब त्रुटियों के एक मॉड्यूल को फिर से लोड किया जाए?
अधिक विशेष रूप से, अगर मैं में एक फ़ाइल module.py
मेरे पूरे मॉड्यूल है उसके बाद निम्न ठीक काम करता है:
import sys
try:
del sys.modules['module']
except AttributeError:
pass
import module
obj = module.my_class()
कोड का यह टुकड़ा खूबसूरती से काम करता है और मैं महीनों के लिए IPython छोड़ने के बिना विकसित कर सकते हैं।
हालांकि, जब भी अपने मॉड्यूल कई submodules से बना है, नरक टूट ढीला:
import os
for mod in ['module.submod1', 'module.submod2']:
try:
del sys.module[mod]
except AttributeError:
pass
# sometimes this works, sometimes not. WHY?
क्यों है कि क्या मैं एक बड़ी फ़ाइल में या कई submodules में मेरी मॉड्यूल है अजगर के लिए कि क्यों भिन्न है? वह दृष्टिकोण क्यों काम नहीं करेगा ??
यह वास्तव में एक बहुत लोकप्रिय सवाल है; हर महीने पॉप अप करें। माइक ने बताया कि वर्तमान सर्वसम्मति आपके दुभाषिया को पुनरारंभ करना है। –
सबसे पहले, मैं नहीं देख सकता कि आप _AttributeError_ को दबाने क्यों कर रहे हैं। वहां कोई रास्ता नहीं है 'del sys.modules [mod] 'एट्रिब्यूट एरर बढ़ाएगा ... सिवाय इसके कि यदि आप बिल्टिन sys मॉड्यूल के अलावा किसी अन्य चीज़ को' sys' को रीबाउंड करते हैं। क्या यह बस दूसरे कोड में हो सकता है, आपके पास 'sys.module' है (जो _will_ सामान्य sys के साथ विशेषता Error बढ़ाता है), और पहले, आपके पास' sys.modules' है? :- पी – Veky