如何在开发机器上强制导入ImportError? (pwd模块)

时间:2010-02-13 15:43:39

标签: python google-app-engine ubuntu import pwd

我正在尝试在Google App Engine上使用第三方lib(docutils)并且遇到此代码的问题(在docutils中):

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

我希望导入失败,就像在实际的GAE服务器上一样,但问题是它在我的开发盒(ubuntu)上没有失败。如果导入不在我自己的代码中,如何使其失败?

2 个答案:

答案 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__,如上所示,提供真正简单的代码。)