gpt4 book ai didi

python - 动态导入的模块认为它没有类

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

设置:Python 3.3

我正在创建一个应用程序,该应用程序在名为“sources”的文件夹中查找 .py 文件,并在其中查找扩展我定义的名为“SourceBase”的类的类。如果它们扩展了 SourceBase,我想创建一个新的类实例来处理。

我通过以下帖子做了相当多的研究,我了解其中的大部分内容:

我的文件夹设置是这样的,我相信这是相关的:

EPDownloader [package]
\
epdownloader.py [main]
SourceBase.py [contains SourceBase class]
imageutils.py [this class will find and dynamically load the classes in the sources package]
sources [package]
\
source1.py [has class that extends SourceBase]
source2.py
...other plugins here...

我的问题是,我正在使用以下代码(来 self 上面列出的其他堆栈溢出问题),并且它正在我的模块中搜索类,但它找不到我的类。它只是跳过它们。我不确定出了什么问题。这是我执行搜索的代码(它基于我发布的第一个链接):

<!--language: python-->
def getSources(self):
pluginbase=SourceBase.SourceBase
searchpath='sources'
#We want to iterate over all modules in the sources/ directory, allowing the user to make their own.
for root, dirs, files in os.walk('./'+searchpath):
print('files: ',files)
candidates = [fname for fname in files if fname.endswith('.py')
and not fname.startswith('__')]
classList=[]
if candidates:
for c in candidates:
modname = os.path.splitext(c)[0]
print('importing: ',modname)
module=__import__(searchpath+'.'+modname) #<-- You can get the module this way
print('Parsing module '+modname)
for cls in dir(module): #<-- Loop over all objects in the module's namespace
print('Inspecting item from module: '+str(cls))
cls=getattr(module,cls) #this seems to still be a module when it hits source1
print('Get attribute: '+str(cls))
if (inspect.isclass(cls)): # Make sure it is a class
print('...is a class')
if inspect.getmodule(cls)==module: # Make sure it was defined in module, not just imported
print('...is in a module')
if issubclass(cls,pluginbase): # Make sure it is a subclass of base
print('...subclasses '+pluginbase.__name__)
classList.append(cls)
print(classList)

这是它给我的相关输出(我修剪了该代码输出的许多其他内容):

Inspecting item from module: source1
Get attribute: <module 'sources.source1' from '/Users/Mgamerz/Documents/workspace/code/EPDownloader/sources/source1.py'>
[] <--- signifies it failed to find the source class

我很确定我的子类化有效,这是该类的片段:

from EPDownloader import SourceBase
class source1(SourceBase.SourceBase):
def __init__(self):
pass

我被这个问题难住了。我在这上面花了几个小时,但我不知道该怎么办。我有一种感觉,这是一个我没有看到的简单修复。有人可以帮我找到这里的错误吗?

[注意:我浏览了 StackOverflow 格式化帮助,没有看到任何格式化“突出显示”的方法,即在文本上放置灰色背景的方式,但是是内联的。这将有助于突出显示我试图传达的这个问题的部分内容。]

最佳答案

查看文档:http://docs.python.org/3.1/library/functions.html#import

When the name variable is of the form package.module, normally, the top-level package (the name up till the first dot) is returned, not the module named by name. However, when a non-empty fromlist argument is given, the module named by name is returned.

简单地替换

module=__import__(searchpath+'.'+modname)

module=__import__(searchpath+'.'+modname, None, None, "*")

它与“fromsources.source1 import *”相同,它告诉__import__获取给定模块内部的所有内容。

关于python - 动态导入的模块认为它没有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21080491/

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