我有一个应用程序,它读取 python 中的测试脚本并将其通过网络发送以在远程 python 实例上执行。由于控制程序不需要运行这些脚本,我不想将测试脚本使用的所有模块安装在控制器的 python 环境中。然而,控制器确实需要来自测试脚本的信息来告诉它如何运行测试。
目前我读取和导入测试脚本数据的操作类似于
with open( 'test.py', 'r' ) as f:
source = f.read()
m = types.ModuleType( "imported-temp", "Test module" )
co = compile( source, 'test.py', 'exec' )
exec co in m.__dict__
这会产生一个包含测试的新模块。不幸的是,如果测试尝试导入控制器没有的东西,exec 将引发 ImportErrors。更糟糕的是,该模块将不会完全导入。
如果我可以保证控制器不会使用丢失的模块,是否可以通过某种方式忽略这些异常?或者有其他方法可以找出测试中定义的名称和类?
示例测试:
from controller import testUnit
import somethingThatTheControllerDoesNotHave
_testAttr = ['fast','foo','function']
class PartOne( testUnit ):
def run( self ):
pass
控制器需要知道的是_testAttr中的数据以及继承自testUnit的所有类定义的名称。
编写一个导入钩子来捕获异常并在模块不存在时返回一个虚拟模块。
import __builtin__
from types import ModuleType
class DummyModule(ModuleType):
def __getattr__(self, key):
return None
__all__ = [] # support wildcard imports
def tryimport(name, globals={}, locals={}, fromlist=[], level=-1):
try:
return realimport(name, globals, locals, fromlist, level)
except ImportError:
return DummyModule(name)
realimport, __builtin__.__import__ = __builtin__.__import__, tryimport
import sys # works as usual
import foo # no error
from bar import baz # also no error
from quux import * # ditto
您也可以将其写入always返回一个虚拟模块,或者如果指定的模块尚未加载则返回一个虚拟模块(提示:如果它位于sys.modules
,它已经被加载)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)