首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在执行源代码时忽略ImportError

在执行源代码时忽略ImportError
EN

Stack Overflow用户
提问于 2011-05-21 03:32:51
回答 3查看 8.8K关注 0票数 5

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

代码语言:javascript
复制
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。更糟糕的是,该模块将不会完全导入。

如果我能保证控制器不会使用缺失的模块,有没有什么办法可以忽略这些异常?或者其他一些方法来找出测试中定义的名称和类?

示例测试:

代码语言:javascript
复制
from controller import testUnit
import somethingThatTheControllerDoesNotHave

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

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

控制器需要知道的是_testAttr中的数据和从testUnit继承的所有类定义的名称。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-21 04:11:27

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

代码语言:javascript
复制
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中,那么它已经被加载了)。

票数 14
EN

Stack Overflow用户

发布于 2011-05-21 03:38:37

我认为,根据你所说的,你可以这样说:

代码语言:javascript
复制
try:
    exec co in m.__dict__
except ImportError: pass

这有帮助吗?

票数 3
EN

Stack Overflow用户

发布于 2011-05-21 04:23:12

您可以使用python ast模块,并将脚本解析为AST树,然后在树中扫描以查找感兴趣的元素。这样一来,您就完全不必执行脚本了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6076770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档