2012-04-06 5 views
4

Каким будет лучший (читай: самый чистый) способ сказать Python импортировать все модули из какой-либо папки?Python: импортировать каждый модуль из папки?

Я хочу разрешить людям размещать свои «моды» (модули) в папке в моем приложении, которую мой код должен проверять при каждом запуске и импортировать любой модуль, который есть там.

Я также не хочу дополнительный охват добавлен в импортированной материал (не «myfolder.mymodule.something», но «что-то»)

+0

возможно дубликат [Загрузка всех модулей в папке в Python] (http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python) –

+0

Посмотрите подобную тему и ее ответ здесь: http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder – vaisakh

ответ

5

Если преобразуя саму папку в модуле, через использование __init__.py файла и используя from <foldername> import * Sui TS вы, вы можете перебирать содержимое папки с «os.listdir» или «glob.glob», и импортировать каждый файл, заканчивающийся на «.py» с встроенной функцией __import__:

import os 
for name in os.listdir("plugins"): 
    if name.endswith(".py"): 
      #strip the extension 
     module = name[:-3] 
     # set the module name in the current global name space: 
     globals()[module] = __import__(os.path.join("plugins", name) 

Преимущество этого подхода заключается в том, что он позволяет динамически передавать имена модулей __import__ - в то время как оператору «mport» требуются имена модулей, которые должны быть жестко закодированы, и это позволяет вам проверять другие вещи о файлах - возможно, размер, или если они импортируют определенные требуемые модули, перед импортом.

+0

Это все еще работает в Python3.6, но последняя строка изменена на: 'import importlib; importlib.import_module ("plugins" + "." + module) ' –

+0

Спасибо - они устарели использование имен файлов в' __import__'. Функция все еще работает, нужно просто использовать «.». там вместо 'os.path.join' – jsbueno

1

Создайте файл с именем

__init__.py 

внутри папки и импортировать имя папки, как это:

>>> from <folder_name> import * #Try to avoid importing everything when you can 
>>> from <folder_name> import module1,module2,module3 #And so on 
+0

отредактировал мой пост с дополнительной информацией –

+0

Ну тогда, как было предложено в ответе, добавьте папку в список os.path и импортируйте то, что вам нужно. – luke14free

0

Вы можете попробовать этот проект: https://gitlab.com/aurelien-lourot/importdir

С помощью этого модуля, вам нужно всего лишь написать две строки, чтобы импортировать все модули из каталога, и вам не нужен дополнительный __init__.py (или любой другой другой дополнительный файл):

import importdir 
importdir.do("plugins/", globals()) 
+0

это работает только для linux-пути? – Sajuuk

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