python自动(或动态)导入包中的类

时间:2009-06-11 15:17:56

标签: python

我正在编写某种自动化测试套件,我想确保包''tests'中包含的类在运行时在主命名空间中自动导入,而不是将它们添加到__init__文件中。包裹。

所以这是我到目前为止的脚本:

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 = __import__(module),则会将类添加到模块“modulename”而不是主命名空间。

我的问题是,如何将它们导入当前命名空间?

所以我可以这样做:

testcase = TestCase()
testcase.run()
results = testcase.results()

或主脚本中的任何内容,而不显式导入类。

提前致谢!

谢谢大家回复并试图帮助我。

6 个答案:

答案 0 :(得分:3)

要从某个模块获取课程,可以有更好的方法,但这里是通用的方式来帮助你开始

mod = __import__("mod")
for klass in vars(mod):
    o =  getattr(mod, klass)
    if type(o) == type:
        print o

答案 1 :(得分:1)

我不确定我是否完全理解您的问题,但您可以尝试nosediscover您的测试套件。

答案 2 :(得分:0)

我不完全理解需要,因为您可以收集所有模块并通过测试用例类进行迭代

但是如果你想在当前范围内获取所有名称 使用像

这样的东西
execfile("mod.py")

它会将mod.py中定义的所有分类纳入范围

答案 3 :(得分:0)

您可以在扫描目录中的每个模块名称的格式化字符串上使用exec:

exec "from %s import *" % moduleName

答案 4 :(得分:0)

将此代码放在测试包的__init__.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__)

正如其他人所说,如果你试图发现所有的测试,那么有更好的方法。

答案 5 :(得分:0)

而不是使用__import__并将其分配给像这样的变量

modulename = __import__(module)

请改用importlib.import_module,不要指定它:

import importlib
importlib.import_module(module)

至少在Python 3.4上,这很好用。