5

我正在尝试在 Google App Engine 上使用第三方库(docutils),但这段代码(在 docutils 中)有问题:

try:
    import pwd
    do stuff
except ImportError:
    do other stuff

我希望导入失败,因为它会在实际的 GAE 服务器上,但问题是它不会在我的开发盒(ubuntu)上失败。鉴于导入不在我自己的代码中,如何使其失败?

4

2 回答 2

11

__import__仅仅插入Nonesys.modules 字典更容易:

>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pwd
于 2010-02-13T20:41:31.047 回答
4

在您的测试框架中,在导入 docutils 之前,您可以执行以下设置任务:

import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
  if name=='pwd': raise ImportError
  return self.savimport(name, *a)
__builtin__.__import__ = myimport

当然在拆解中让事情恢复正常:

__builtin__.__import__ = self.savimport

说明:所有导入操作都经过__builtin__.__import__,您可以重新分配该名称以使此类操作使用您自己的代码(诸如导入钩子之类的替代方法更好地用于从非文件系统源执行导入,但对于您的用途,覆盖__builtin__.__import__,如您在上面看到的,提供了真正简单的代码)。

于 2010-02-13T15:49:21.857 回答