我有一个文件夹('root'),其中包含各种子文件夹和* .py文件。 'root'不是包只是一个包含不同脚本的文件夹。我试图在'root'中找到包含从特定基类继承的类的所有脚本。目标是向用户提供可供选择的特定脚本选择。
查找子类最明显的方法是使用__subclasses__()
但是需要加载所有类(即在类上调用__subclasses__()
只会找到当前加载的那些子类),这不是当你有一个装满个人脚本的文件夹时,那就太好了。
我试图在'root'中搜索所有* .py文件,然后尝试使用importlib
逐个导入它们,这不仅非常缓慢(如您所想),我没有甚至让它正常工作。
基类定义为MyBaseClass(with_metaclass(abc.ABCMeta, SomeOtherClass))
我对abc
知之甚少,所以我不确定它是否提供任何有用的功能。 (我现在正在研究这个)
Java有一个简洁的Lookup包(http://bits.netbeans.org/7.4/javadoc/org-openide-util-lookup/org/openide/util/Lookup.html),它允许您标记类,然后使用特定标记查找所有类。 (它通常在jar的范围内进行查找,因此不完全相同)
我的问题是:有没有合适的方法让它发挥作用?
最初发布为评论,放在这里以提高可见度:
“这些脚本是模拟的不同启动脚本和生成器。它们都只从少数几个基类中继承。基类可以根据需要进行更改。所以我一直在寻找一种方法来收集所有继承自的脚本一个特定的基类,用于表示特定脚本的选择。“
我目前用于抓取目录并导入所有* .py文件的代码:
def all_files(directory):
for path, dirs, files in os.walk(directory):
for f in files:
if f.endswith('.py'):
yield os.path.join(path, f)
# Found here:
# https://stackoverflow.com/questions/3137731/is-this-correct-way-to-import-python-scripts-residing-in-arbitrary-folders
def import_from_absolute_path(fullpath, global_name=None):
script_dir, filename = os.path.split(fullpath)
script, ext = os.path.splitext(filename)
sys.path.insert(0, script_dir)
try:
module = __import__(script)
if global_name is None:
global_name = script
globals()[global_name] = module
sys.modules[global_name] = module
except ModuleNotFoundError as mnf:
print(mnf)
except ImportError as ie:
print(ie)
except FileNotFoundError as fnf:
print(fnf)
finally:
del sys.path[0]