我有一个文件夹,其中包含多个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
如果我reload(package)
,也应该正确地重新加载子模块。
这种做法有意义吗?是否会导致将来出现问题,特别是如果使用多个嵌套文件夹实现,则第一个将重新加载链中的所有其他文件夹? 是否有更好,更整洁的方法来解决同一问题?