包中的python自动(或动态)导入类
我正在编写某种类型的自动化测试套件,我希望确保包“tests”中包含的类在运行时在主命名空间中自动导入,而无需将它们添加到包的包中的python自动(或动态)导入类,python,Python,我正在编写某种类型的自动化测试套件,我希望确保包“tests”中包含的类在运行时在主命名空间中自动导入,而无需将它们添加到包的\uuuu init\uu文件中 这是我到目前为止的剧本: import os for dirpath, dirnames, filenames in os.walk('tests'): for filename in filenames: if filename.lower().endswith(('.pyc', '__init__.py'))
\uuuu init\uu
文件中
这是我到目前为止的剧本:
import os
for dirpath, dirnames, filenames in os.walk('tests'):
for filename in filenames:
if filename.lower().endswith(('.pyc', '__init__.py')): continue
module = ".".join([dirpath, filename.split('.')[0]])
print module
如果我使用modulename=\uuuuu import\uuuu(module)
类将添加到模块“modulename”,而不是主命名空间
我的问题是,如何将它们导入当前名称空间
所以我可以这样做:
testcase = TestCase()
testcase.run()
results = testcase.results()
或者主脚本中的任何内容,而不显式导入类
提前谢谢
谢谢大家的回复和帮助。我不完全理解这个需求,因为您可以收集所有模块并通过测试用例类进行迭代 但如果您确实希望获取当前范围中的所有名称 使用类似
execfile("mod.py")
它将把mod.py中定义的所有类划分到范围中我不确定我是否完全理解您的问题,但您可以尝试测试套件。要从某个模块中获取类,可以有更好的方法,但这里有一个通用的方法让您开始
mod = __import__("mod")
for klass in vars(mod):
o = getattr(mod, klass)
if type(o) == type:
print o
对于扫描目录中的每个模块名称,可以在格式化字符串上使用exec:
exec "from %s import *" % moduleName
将此代码放在测试包的_init__u; py.py中,它将导入当前包和子包中的所有测试
import pkgutil
import unittest
for loader, module_name, is_pkg in pkgutil.walk_packages(__path__):
module = loader.find_module(module_name).load_module(module_name)
for name in dir(module):
obj = getattr(module, name)
if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase):
exec ('%s = obj' % obj.__name__)
正如其他人所说,如果您试图发现所有的测试,有更好的方法。而不是使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuu>并将其分配给这样的变量
modulename = __import__(module)
改用importlib.import\u模块
,不要分配它:
import importlib
importlib.import_module(module)
至少在Python3.4上,这很好。如何通过测试用例类进行迭代?我不知道怎么做。我想这就是我要寻找的?我在另一个答案中加入了一个示例,因为我无法在注释中添加代码。为什么您不使用Python的unittest testloader功能?如果您使用的是Python 2或3,这可能与此相关。@s.Lott:不幸的是,unittest
会做一些愚蠢的事情,比如导入\uuuu main\uuuuuuuuuuuuuuuuuy
文件。