2016-06-30 3 views
3

그래서 특정 이름의 폴더에서 모듈을 동적으로 가져 오는 간단한 프로그램을 만들려고했습니다. 나는 디렉토리에 os으로 cd를하고 나는 변수 이름 module에 반복되는 것으로 기술 된 모든 파일 이름을 가지고 for 루프에있다. 따라서 module = __import__(module_name)을 실행한다.동적 가져 오기 모듈을 사용하면 ImportError가 발생합니다.

내 유일한 문제는 내가이 맞았 얻을 수 있습니다 :

ImportError: No module named "module_name" 

은 (내가 문자열로 준 변수의 이름을 말). 파일이 존재합니다. 언급 된 디렉토리에 있으며 import은 같은 디렉토리에서 잘 작동합니다. 그러나 정상적인 가져 오기는 cd 디렉토리의 모듈에서 작동하지 않습니다. 코드는 다음과 같습니다. 이것이 명백한 질문이라면 유감입니다. 당신은 단순히 os.chdir로 현재 디렉토리를 변경하는 경우

import os 

class Book(): 
    def __init__(self): 
     self.name = "Book of Imps" 
     self.moduleNames = [] 

    # configure path 
    def initialize(self): 
     path = os.getcwd() + '/Imp-pit' 
     os.chdir(path) 
     cwd = os.walk(os.getcwd()) 
     x, y, z = next(cwd) 
     # Build Modules 
     for name in z: 
      if name[:3] == 'Imp': 
       module_name = name[:len(name) - 3] 
       module = __import__(module_name) 

def start_sim(): 
    s = Book() 
    s.initialize() 

if __name__ == '__main__': 
    start_sim() 

답변

1

나는 인터프리터가 동적으로 sys.path을 변경 생각하지 않습니다. 모듈을 찾을 때

sys.path.insert(0, path) 

파이썬은 일반적으로 sys.path를 검색, 그래서 당신이 거기를 지정하면은 그것을 발견 할 것이다 : 당신은 수동으로 작동하려면, sys.path 목록에 즉을 path 변수를 삽입해야합니다.

추가 참고 사항; __import__을 사용하지 말고 importlib.import_module을 사용하십시오. 인터페이스는 정확히 동일하지만 두 번째 인터페이스는 일반적으로 documentation에 있습니다.

0

당신은 시도-를 제외한 개념, 예컨대 : 내가 이해 않은 경우

try: 
    import csv    
except ImportError: 
    raise ImportError('<error message>') 

당신이 다음

try: 
    module = __import__(module_name) 
except ImportError: 
    raise ImportError('<error message>') 
를 해결을 사용해야합니다
관련 문제