我正尝试在Google App Engine上使用第三方库(docutils),并且在代码中存在问题(在docutils中):
try: import pwd do stuff except ImportError: do other stuff
我想导入失败,因为它会在实际的GAE服务器上,但问题是,它不会在我的开发框(Ubuntu的)失败。 如何使它失败,鉴于导入不在我自己的代码?
甚至比搞乱__import__
更简单的是在sys.modules __import__
中插入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
在您的测试框架中,在导入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__
,如你所见,提供真正简单的代码)。