2014-09-12 6 views
0

파이썬에서 동적으로 가져온 모듈에 액세스 할 수 없습니다.동적으로 가져온 파이썬 모듈을 호출 할 수 없습니다.

내 전화 구문이 잘못되었거나 가져 오기가 제대로 작동하지 않습니다.

Python에서 동적 가져 오기를 처리하는 많은 주제가 stackoverflow.com에 있습니다. 그러나이 사이트의 코드를 다음과 같이 채택했습니다. https://www.daniweb.com/software-development/python/code/238387/really-simple-plugins-loader-import-all-modules-in-a-folder-in-one-swoop

폴더에있는 모든 모듈을 자동으로 가져 와서 사전을 반환합니다.

코드 : 성공적인 수입

import glob, imp 
from os.path import join, basename, splitext 

def importPluginModulesIn(dir): 
    return dict(_load(path) for path in glob.glob(join(dir,'[!_]*.py'))) 
def _load(path): 
    name, ext = splitext(basename(path)) 
    return name, imp.load_source(name, path) 

modules = importPluginModulesIn('modules_folder') 
print modules 

출력은 제안 : 수익률은 모든 에서 응답이 (

{'test_function': <module 'test_function' from 'modules_folder/test_function.py'>} 
그러나

, 제안 된 접근 방법을 인쇄 안 : "완전한 테스트를.") :

modules['test_function'].__name__ 

누구든지이 문제를 해결하는 방법을 제안 했습니까? 감사합니다.

편집 : Martijn Pieters는 내가 실제로 모듈과 기능을 착각하고 있음을 알고있었습니다. (아래 의견을 참조하십시오.) 이제 제 질문은 실제로 내 코드의 프레임 안에서 test_function을 호출하여 모듈에 포함 된 것입니다 test_function.py?

EDIT2 : modules_folder에서 test_function.py의 내용 :

import time 

def test_function(): 
    print('Start.') 
    time.sleep(1)  
    print('Test complete.') 
+0

모듈을 가져 왔습니다. 왜 모듈 이름이'Test complete '라고 기대합니까? 모듈 이름을 다른 것으로 바꾸는 모듈은 무엇입니까? –

+0

'Test complete'는 이름이 아닌 test_function의 인쇄물입니다! –

+0

맞아요.하지만 기능이 아닌 ** 모듈 **이 있습니다! 그리고 당신은 그 모듈 객체의'__name__'에 접근하려고합니다, 이것은 어떤 함수 출력도 아닌 모듈 이름입니다. –

답변

0

일을 시도는 :

for name in modules: 
    getattr(modules[name], name)() 

그것은 잘 작동합니다.

+0

감사합니다. 하지만 이것은 작동하지 않습니다 : KeyError : 'test_function'. 또한 가져 오기 기능을 하드 코딩하지 않으므로 동적 가져 오기의 목적을 무시합니다. –

+0

test_function.py의 내용은 무엇입니까? 왜 'KeyError'가 있는지 알아 낸 후에, getattr (modules ['test_function '],'test_function ')()'을 시도해보십시오. – Hetzroni

+0

대답 해 주셔서 감사합니다. Loquacious! 요청한대로 동적으로 함수를 호출 할 수 있습니다. –

관련 문제