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

2 投票
6 回答
4960 浏览
提问于 2025-04-15 12:11

我正在写一个自动化测试套件,想确保在运行时,'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

你可以对扫描到的每个模块名称使用格式化字符串的exec命令:

exec "from %s import *" % moduleName
1

我不太确定我完全理解你的问题,不过你可以试试nose这个工具,来查找你的测试套件。

3

要从某个模块中获取类,有更好的方法,但这里提供一种通用的方法来帮助你入门。

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

撰写回答