如何在开发机器上强制引发ImportError?(pwd模块)
我正在尝试在 Google App Engine 上使用一个第三方库(docutils),但是在这段代码(在 docutils 中)上遇到了问题:
try:
import pwd
do stuff
except ImportError:
do other stuff
我希望这个导入能失败,就像在真正的 GAE 服务器上一样,但问题是它在我的开发环境(ubuntu)上并没有失败。既然这个导入不在我自己的代码里,我该怎么做才能让它失败呢?
2 个回答
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__
,可以让代码变得非常简单)。
12
比起使用 __import__
,直接在 sys.modules 字典里插入 None
更简单:
>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pwd