2011-01-25 11 views
11

जहां तक ​​मैं समझता हूं, एक पाइथन मॉड्यूल दो बार आयात नहीं किया जाता है, यानी मॉड्यूल में कोड केवल आयात किए जाने पर पहली बार निष्पादित हो जाता है। बाद के आयात विवरण केवल आयात के दायरे में मॉड्यूल जोड़ें।पाइथन मॉड्यूल को दो बार आयात करने का कारण क्या हो सकता है?

मेरे पास "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__ ओवरराइड करने के अलावा अन्य तंत्र हैं जो मेरे मॉड्यूल को कई बार लोड होने की व्याख्या कर सकते हैं?

उत्तर

22

यदि पथ में दो बार मॉड्यूल पाया जाता है तो एक पायथन मॉड्यूल दो बार आयात किया जा सकता है। उदाहरण के लिए, मान लें कि आपका परियोजना इसलिए की तरह खर्च की गई थी:

  • src/
    • package1/
      • spam.py
      • eggs.py

मान लीजिए कि आपके PYTHONPATH (sys.path) में src और src/pac शामिल है kage1:

PYTHONPATH=/path/to/src:/path/to/src/package1 

अगर ऐसी बात है, आप एक ही मॉड्यूल दो बार इस तरह आयात कर सकते हैं:

from package1 import spam 
import spam 

और अजगर वे विभिन्न मॉड्यूल हैं सोचेंगे। क्या यह चल रहा है?

इसके अलावा, नीचे दी गई चर्चा के अनुसार (इस प्रश्न को खोजने वाले उपयोगकर्ताओं के लिए), एक और तरीका एक मॉड्यूल दो बार आयात किया जा सकता है यदि पहले आयात के माध्यम से कोई अपवाद मिडवे है। उदाहरण के लिए, यदि स्पैम अंडे आयात करता है, लेकिन मॉड्यूल के अंदर अंडे आयात करने के परिणाम में अपवाद करते हैं, तो इसे फिर से आयात किया जा सकता है।

+0

यह एक अच्छा मुद्दा है, लेकिन मुझे नहीं लगता कि इस मामले में क्या हो रहा है। जैसा कि आप स्टैक निशान में देख सकते हैं, मॉड्यूल दोनों मामलों में एक ही कथन के साथ आयात किया जाता है: "TiledConvC3D आयात करें" –

+3

क्या यह संभव है कि आयात पहली बार मध्य-मार्ग में विफल हो रहा है? उदाहरण के लिए यदि मॉड्यूल आयात करने के माध्यम से आधा रास्ता अपवाद हो सकता है? –

+0

हां, यह समस्या थी। मुझे एहसास नहीं हुआ कि कोशिश कथन के अंदर आयात की अनुमति थी। –

संबंधित मुद्दे