我正在尝试在Google App Engine上使用第三方lib(docutils)并且遇到此代码的问题(在docutils中):
try:
import pwd
do stuff
except ImportError:
do other stuff
我希望导入失败,就像在实际的GAE服务器上一样,但问题是它在我的开发盒(ubuntu)上没有失败。如果导入不在我自己的代码中,如何使其失败?
答案 0 :(得分:9)
更容易搞乱__import__
只是在sys.modules dict中插入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
答案 1 :(得分: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__
,如上所示,提供真正简单的代码。)