2016-12-10 3 views
1

Я работаю над небольшим проектом питомца на питоне, и я хочу иметь возможность писать внешние модули и динамически импортировать их. До сих пор, у меня есть что-то вроде этого:Итерирование файлов python в заданном каталоге и их импорт?

def getModules(self): 
    os.chdir(moduleDir) 
    for module in os.listdir(): 
      #code goes here to import 
      #also append to a list for use later on 

Я хотел бы использовать import module, но это только дает ошибку синтаксиса.

+0

Вы пытались использовать «\ _ \ _ import \ _ \ _»? – martianwars

+1

попытайтесь использовать 'importlib.import_module', если ваш moduleDir является пакетом, используйте' pkgutil.walk_packages', чтобы перечислить все модули. –

+0

@hjfitz, если вы удовлетворены одним из ответов, пожалуйста, примите их – martianwars

ответ

3

Вы можете использовать importlib.import_module() так:

import importlib 

my_modules = [] 

def getModules(self): 
    os.chdir(moduleDir) 
    for module in os.listdir(): 
      my_module = importlib.import_module(module[:-3]) # Or: module.split('.')[0] 
      my_modules.append(my_module) 

Пример:

Допустим, у нас есть модуль a, который содержит следующую функцию:

def fn(): 
    print("Hello World") 

Ниже приводится результат:

>>> import importlib 
>>> 
>>> my_module = importlib.import_module('a') # Note: 'a' without '.py' 
>>> 
>>> my_module.fn() 
Hello World 
2

Вы должны использовать функцию __import__. Нечто подобное поможет,

def getModules(self): 
    modules = [] 
    os.chdir(moduleDir) 
    for module in os.listdir('.'): 
      m = __import__(module.split('.')[0]) # Assuming your listdir() gives .py files 
      modules.append(m) 

Еще лучше выбор будет importlib.import_module(), который является оберткой __import__. Он имеет аналогичный синтаксис для __import__. Конечно, вам нужно import importlib.

Смежные вопросы