У меня есть папка, содержащая несколько файлов Python и __init__.py
, аналогично этому.
package
__init__.py
foo.py
bar.py
Я хочу иметь возможность импортировать эту папку как модуль и автоматически импортировать из __init__.py
файл все модули, содержащиеся в папке, а также.Когда я перезагружаю эту конкретную папку, все модули python, содержащиеся в ней, также должны автоматически перезагружаться.
Кроме того, поскольку мне придется работать с несколькими папками с таким же ограничением, я хотел бы запуститьэто из внешней служебной функции в файле с именем utils.py
, поэтому мне не нужно копировать и вставлять мой код в каждый отдельный файл __init__.py
моего проекта.
Я знаю, что уже был другой вопрос, задающий что-то подобное тут и там, но мне больше всего интересно узнать о предложенном мною решении.Кажется, что код работает, но прежде чем полностью выполнить его, я хочу убедиться, что я не допускаю ошибок, которые могут привести к будущим проблемам, таким как перегруженные пространства имен и т. Д.
Вот код.Первый файл - это служебный файл, который содержит функцию, которую будет вызывать каждая папка __init__.py
.
utils.py
import sys, os
import importlib
def load_module(path, caller):
# cycle through every file in the given directory
for file in os.listdir(path):
# check if the file is a python file and not an __init__
if file.endswith(".py") and file != "__init__.py":
# get the name of the module, without extension,
name = os.path.splitext(file)[0]
# and the full path of the module relative to the caller
module = '%s.%s' %(caller, name)
# if the module is in sys.modules, delete it so it can be reloaded
if module in sys.modules:
print "reloading", module
del sys.modules[module]
# do the import of the module using importLib
module_obj = importlib.import_module(module, caller)
# add the module as a global variable in the caller
sys._getframe(1).f_globals[name] = module_obj
# add the module to sys.modules
sys.modules[module] = module_obj
И вот как мой __init__.py
будет выглядеть.
__ init __. Py
import os
import utils
path = os.path.dirname(__file__)
utils.load_module(path, __name__)
foo.py
a = "Working"
Используя вышеуказанные файлы, я могу сделать
import package
print package.foo.a
и если I reload(package)
, то субмодули также должны быть правильно перезагружены.
Имеет ли эта практика какой-либо смысл?Может ли это привести к будущим проблемам, особенно если они будут реализованы с несколькими вложенными папками, где первая перезагрузит все остальные в цепочке?Есть ли лучшие и более точные способы преодоления той же проблемы?