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

5 投票
2 回答
1118 浏览
提问于 2025-04-15 19:14

我正在尝试在 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

撰写回答