Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
包中的python自动(或动态)导入类_Python - Fatal编程技术网

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

包中的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'))

我正在编写某种类型的自动化测试套件,我希望确保包“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')): 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
文件。