我正在尝试在 Google App Engine 上使用第三方库(docutils),但这段代码(在 docutils 中)有问题:
try:
import pwd
do stuff
except ImportError:
do other stuff
我希望导入失败,因为它会在实际的 GAE 服务器上,但问题是它不会在我的开发盒(ubuntu)上失败。鉴于导入不在我自己的代码中,如何使其失败?
我正在尝试在 Google App Engine 上使用第三方库(docutils),但这段代码(在 docutils 中)有问题:
try:
import pwd
do stuff
except ImportError:
do other stuff
我希望导入失败,因为它会在实际的 GAE 服务器上,但问题是它不会在我的开发盒(ubuntu)上失败。鉴于导入不在我自己的代码中,如何使其失败?
比__import__
仅仅插入None
sys.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
在您的测试框架中,在导入 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__
,如您在上面看到的,提供了真正简单的代码)。