gpt4 book ai didi

python - 在Python中动态导入类

转载 作者:行者123 更新时间:2023-11-30 23:39:38 25 4
gpt4 key购买 nike

我想从给定的字符串动态加载一个类。但是,我不知道该类将位于哪个文件中,因此我必须搜索所有文件。我已经尝试过这个,但我得到 AttributeError: 'module' object has no attribute 'MyClass' 即使我 100% 确定该模块(在当前迭代中)具有该类:

target = 'MyClass'
module_names = [mf[0:-3] for mf in os.listdir('application/models') if mf.endswith(".py")]
modules = [imp.new_module(x) for x in module_names]
for module in modules:
try:
target_class = getattr(module, target)
except ImportError, AttributeError:
continue

if target_class:
print 'found class'

看来我已经非常接近了。我想要的不是将搜索限制在一个文件夹,而是可能是多个文件夹。我的代码有什么问题吗?

编辑:好的,现在我正在尝试类似的操作,但仍然遇到相同的错误:

    for m in module_names:
try:
x = reload(__import__(m))
target_class = getattr(x, target)
except ImportError, AttributeError:
continue
else:
break

if target_class:
print 'found class'

最佳答案

来自 imp.new_module 的文档,返回的模块是。这意味着它永远不会包含您的类(class)。

也许您想要做的是将目标目录添加到 sys.path 并使用 __import__ 动态导入这些模块,然后检查您的类?

<小时/>

以下代码对我有用:

modules = ['foo','bar']
for mod in modules:
try:
x = reload(__import__(mod))
except ImportError:
print "bargh! import error!"
continue
try:
cls = getattr(x,'qux')
except AttributeError:
continue

a = cls()
print a.__class__.__name__

其中 foo.pybar.py 位于同一目录中:

#foo.py
class foo(object):
pass

和:

#bar.py
class qux(object):
pass

关于python - 在Python中动态导入类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13382650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com