gpt4 book ai didi

python - 执行源代码时忽略 ImportError

转载 作者:太空狗 更新时间:2023-10-30 01:43:04 24 4
gpt4 key购买 nike

我有一个应用程序可以读取 python 中的测试脚本并通过网络发送它们以在远程 python 实例上执行。由于控制程序不需要运行这些脚本,我不想将测试脚本使用的所有模块都安装在 Controller 的 python 环境中。然而, Controller 确实需要来自测试脚本的信息来告诉它如何运行测试。目前我读取和导入测试脚本数据的方式类似于

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__

这会产生一个包含测试的新模块。不幸的是,如果测试试图导入 Controller 没有的东西,exec 将引发 ImportErrors。更糟糕的是,该模块将不会被完全导入。

如果我能保证 Controller 不会使用丢失的模块,有什么办法可以忽略这些异常吗?或者通过其他方式找出测试中定义的名称和类?

实例测试:

from controller import testUnit
import somethingThatTheControllerDoesNotHave

_testAttr = ['fast','foo','function']

class PartOne( testUnit ):
def run( self ):
pass

controller需要知道的是_testAttr中的数据和所有继承自testUnit的类定义的名称。

最佳答案

编写一个捕获异常的导入 Hook ,如果模块不存在则返回一个虚拟模块。

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

你也可以将它写成总是返回一个虚拟模块,或者如果指定的模块还没有被加载则返回一个虚拟模块(提示:如果它在sys.modules ,它已经被加载了)。

关于python - 执行源代码时忽略 ImportError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6076770/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com