def _load_plugins(self, plugin_dir, namespace):
"""
Load all modules in plugin_dir
"""
if not os.path.exists(os.path.join(plugin_dir, "__init__.py")):
raise Exception("The plugin directory %s should be a valid python package with a __init__.py file" % plugin_dir)
mod_name = ".".join(namespace.to_path())
imp.load_package(mod_name, plugin_dir)
for py_file in glob.glob(os.path.join(plugin_dir, "*.py")):
if not py_file.endswith("__init__.py"):
# name of the python module
sub_mod = mod_name + "." + os.path.basename(py_file).split(".")[0]
# create a namespace for the submodule
new_ns = Namespace(sub_mod.split(".")[-1])
new_ns.parent = namespace
self.graph.add_namespace(new_ns, namespace)
# load the python file
imp.load_source(sub_mod, py_file)
python类load_package()的实例源码
def load_plugins(self):
"""
Load all plug-ins from a configuration module
"""
plugin_dir = os.path.join(self._path, "plugins")
if not os.path.exists(plugin_dir):
return
if not os.path.exists(os.path.join(plugin_dir, "__init__.py")):
raise CompilerException(
"The plugin directory %s should be a valid python package with a __init__.py file" % plugin_dir)
try:
mod_name = self._meta["name"]
imp.load_package("inmanta_plugins." + mod_name, plugin_dir)
self._plugin_namespaces.append(mod_name)
for py_file in glob.glob(os.path.join(plugin_dir, "*.py")):
if not py_file.endswith("__init__.py"):
# name of the python module
sub_mod = "inmanta_plugins." + mod_name + "." + os.path.basename(py_file).split(".")[0]
self._plugin_namespaces.append(sub_mod)
# load the python file
imp.load_source(sub_mod, py_file)
except ImportError as e:
raise CompilerException("Unable to load all plug-ins for module %s" % self._meta["name"]) from e