51 python dynamic python-import
在python中,如何在编程运行时动态地将模块添加到包中.
我希望能够从外部进程将模块添加到包目录中,并且能够在我的程序中使用这些新模块:
import package
def doSomething(name):
pkg = __import__("package." + name)
mod = getattr(pkg, name)
mod.doSomething()
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
S.L*_*ott 55
你的代码几乎是正确的.
看__import__功能.
def doSomething(name):
name = "package." + name
mod = __import__(name, fromlist=[''])
mod.doSomething()
Run Code Online (Sandbox Code Playgroud)
Gio*_*rdi 23
Bastien已经回答了这个问题,无论如何你可能会发现这个函数用来加载字典中子文件夹中的所有模块:
def loadModules():
res = {}
import os
# check subfolders
lst = os.listdir("services")
dir = []
for d in lst:
s = os.path.abspath("services") + os.sep + d
if os.path.isdir(s) and os.path.exists(s + os.sep + "__init__.py"):
dir.append(d)
# load the modules
for d in dir:
res[d] = __import__("services." + d, fromlist = ["*"])
return res
Run Code Online (Sandbox Code Playgroud)
另一个是通过在第一个函数加载的模块之一中定义的类来实例化对象:
def getClassByName(module, className):
if not module:
if className.startswith("services."):
className = className.split("services.")[1]
l = className.split(".")
m = __services__[l[0]]
return getClassByName(m, ".".join(l[1:]))
elif "." in className:
l = className.split(".")
m = getattr(module, l[0])
return getClassByName(m, ".".join(l[1:]))
else:
return getattr(module, className)
Run Code Online (Sandbox Code Playgroud)
使用这些功能的一种简单方法是:
mods = loadModules()
cls = getClassByName(mods["MyModule"], "submodule.filepy.Class")
obj = cls()
Run Code Online (Sandbox Code Playgroud)
显然,您可以使用参数替换所有"服务"子文件夹引用.
小智 13
import importlib
module = importlib.import_module('my_package.my_module')
my_class = getattr(module, 'MyClass')
my_instance = my_class()
Run Code Online (Sandbox Code Playgroud)
Bastien回答的一个技巧......该__import__()函数返回包对象,而不是模块对象.如果使用以下函数,它将从包中动态加载模块并返回模块,而不是包.
def my_import(name):
mod = __import__(name)
components = name.split('.')
for comp in components[1:]:
mod = getattr(mod, comp)
return mod
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
mod = my_import('package.' + name)
mod.doSomething()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56059 次 |
| 最近记录: |