2011-01-25 4 views
11

필자가 이해하는 한, 파이썬 모듈은 두 번 가져 오지 않습니다. 즉, 모듈의 코드는 처음 가져올 때만 실행됩니다. 후속 import 문은 모듈을 가져 오기 범위에 추가합니다.파이썬 모듈을 두 번 가져올 수 있습니까?

나는 "TiledConvC3D.py"라는 모듈을 여러 번 가져 오는 것 같습니다. 이 모듈의 코드 맨 위에 스택을 인쇄하려면 pdb를 사용합니다.

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__의 ID를 확인합니다. 내 메인 스크립트의 맨 처음에 다른 가져 오기를 수행하기 전에 __builtin__을 가져오고 id(__builtin__.__import__)을 인쇄합니다. 또한 여러 번 가져오고 내 모듈 내부에서 id(__builtin__.import__) 인쇄하고 ID 값을 변경하지 않습니다.

내 모듈이 여러 번로드되는 것을 설명 할 수있는 __builtin__.__import__을 다시로드하고 재정의하는 것 외에 다른 메커니즘이 있습니까?

답변

22

모듈이 경로에서 두 번 발견되면 Python 모듈을 두 번 가져올 수 있습니다. 예를 들어, 프로젝트는과 같이 배치되는 말 :

  • SRC/
    • package1/
      • spam.py
      • eggs.py

PYTHONPATH (sys.path)에 src 및 src/pac가 포함되어 있다고 가정합니다. kage1 :

from package1 import spam 
import spam 

을 그리고 파이썬은 다른 모듈 생각합니다 : 그런 경우에는

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

, 당신은 이런 식으로 두 번 같은 모듈을 가져올 수 있습니다. 그게 무슨 일 이니?

또한 아래 토론 (이 질문을 검색하는 사용자)에서 모듈을 두 번 가져올 수있는 다른 방법은 첫 번째 가져 오기의 중간 단계에서 예외가있는 경우입니다. 예를 들어, 스팸을 가져 오기하지만 계란을 가져 오는 경우 모듈 안에 예외가 발생하면 다시 가져올 수 있습니다.

+0

좋은 지적이지만이 경우에는 그렇게 생각하지 않습니다. 스택 트레이스에서 볼 수 있듯이 모듈은 두 경우 모두 동일한 문장으로 가져옵니다. "import TiledConvC3D" –

+3

수입이 처음에 중간에 실패 할 가능성이 있습니까? 예를 들어, 모듈을 가져 오는 중반에 예외가있는 경우? –

+0

네, 이것이 문제였습니다. 나는 import가 try 문 안에서 허용된다는 것을 깨닫지 못했다. –

관련 문제