जहां तक मैं समझता हूं, एक पाइथन मॉड्यूल दो बार आयात नहीं किया जाता है, यानी मॉड्यूल में कोड केवल आयात किए जाने पर पहली बार निष्पादित हो जाता है। बाद के आयात विवरण केवल आयात के दायरे में मॉड्यूल जोड़ें।पाइथन मॉड्यूल को दो बार आयात करने का कारण क्या हो सकता है?
मेरे पास "TiledConvC3D.py" नामक एक मॉड्यूल है जो कि कई बार आयात किया जाता है। मैं इस मॉड्यूल के लिए कोड के शीर्ष पर स्टैक मुद्रित करने के लिए पीडीबी का उपयोग करता हूं।
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh
key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 18, in <module>
pdb.traceback.print_stack()
यह पर चला जाता है कई बार निष्पादित करने के लिए:
यहाँ पहली बार मॉड्यूल निष्पादित किया जाता है से स्टैक ट्रेस का अंत है। हालांकि, दूसरी बार यह कहा जाता है reload
के लिए किसी भी कॉल प्रदर्शित नहीं करता है के लिए पूर्ण स्टैक ट्रेस, इसलिए इन फांसी होने वाली नहीं किया जाना चाहिए:
File "sup_train_conj_grad.py", line 103, in <module>
dataset = Config.get_dataset(dataset_node)
File "<anonymized>/Config.py", line 279, in get_dataset
from datasets import NewWiskott
File "<anonymized>/datasets/NewWiskott.py", line 16, in <module>
normalizer_train = video.ContrastNormalizer3D(sigma, global_per_frame = False, input_is_5d = True)
File "<anonymized>/util/video.py", line 204, in __init__
self.f = theano.function([input],output)
File "<anonymized>/python_modules/Theano/theano/compile/function.py", line 105, in function
allow_input_downcast=allow_input_downcast)
File "<anonymized>/python_modules/Theano/theano/compile/pfunc.py", line 270, in pfunc
accept_inplace=accept_inplace, name=name)
File "<anonymized>/python_modules/Theano/theano/compile/function_module.py", line 1105, in orig_function
fn = Maker(inputs, outputs, mode, accept_inplace = accept_inplace).create(defaults)
File "/u/goodfeli/python_modules/Theano/theano/compile/function_module.py", line 982, in create
_fn, _i, _o = self.linker.make_thunk(input_storage = input_storage_lists)
File "<anonymized>/python_modules/Theano/theano/gof/link.py", line 321, in make_thunk
output_storage = output_storage)[:3]
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1178, in make_all
output_storage = node_output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 774, in make_thunk
cthunk, in_storage, out_storage, error_storage = self.__compile__(input_storage, output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 723, in __compile__
output_storage)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1037, in cthunk_factory
module = get_module_cache().module_from_key(key=key, fn=self.compile_cmodule)
File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 59, in get_module_cache
return cmodule.get_module_cache(config.compiledir)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 576, in get_module_cache
_module_cache = ModuleCache(dirname, force_fresh=force_fresh)
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 268, in __init__
self.refresh()
File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 326, in refresh
key = cPickle.load(open(key_pkl, 'rb'))
File "<anonymized>/ops/TiledConvV3D.py", line 504, in <module>
import TiledConvG3D
File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module>
import TiledConvC3D
File "<anonymized>/ops/TiledConvC3D.py", line 22, in <module>
pdb.traceback.print_stack()
इसके अलावा, मैं भी __builtin__.__import__
की आईडी की जाँच करें। मेरी मुख्य लिपि की शुरुआत में, मैं __builtin__
आयात करता हूं और कोई अन्य आयात करने से पहले id(__builtin__.__import__)
प्रिंट करता हूं। मैं अपने मॉड्यूल के अंदर से id(__builtin__.import__)
प्रिंट करता हूं जिसे कई बार आयात किया जा रहा है, और आईडी का मान नहीं बदलता है।
क्या पुनः लोड करने और __builtin__.__import__
ओवरराइड करने के अलावा अन्य तंत्र हैं जो मेरे मॉड्यूल को कई बार लोड होने की व्याख्या कर सकते हैं?
यह एक अच्छा मुद्दा है, लेकिन मुझे नहीं लगता कि इस मामले में क्या हो रहा है। जैसा कि आप स्टैक निशान में देख सकते हैं, मॉड्यूल दोनों मामलों में एक ही कथन के साथ आयात किया जाता है: "TiledConvC3D आयात करें" –
क्या यह संभव है कि आयात पहली बार मध्य-मार्ग में विफल हो रहा है? उदाहरण के लिए यदि मॉड्यूल आयात करने के माध्यम से आधा रास्ता अपवाद हो सकता है? –
हां, यह समस्या थी। मुझे एहसास नहीं हुआ कि कोशिश कथन के अंदर आयात की अनुमति थी। –