Как заставить ImportError на компьютере разработчика? (модуль pwd) - PullRequest
4 голосов
/ 13 февраля 2010

Я пытаюсь использовать стороннюю библиотеку (documentstils) в Google App Engine и у меня возникла проблема с этим кодом (в Docutils):

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

Я хочу, чтобы импорт потерпел неудачу, как и на реальном сервере GAE, но проблема в том, что он не выходит из строя на моем компьютере для разработки (Ubuntu). Как заставить его потерпеть неудачу, учитывая, что импорт не в моем собственном коде?

Ответы [ 2 ]

9 голосов
/ 13 февраля 2010

Даже проще, чем возиться с __import__ - просто вставить None в команду sys.modules:

>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pwd
4 голосов
/ 13 февраля 2010

В вашей инфраструктуре тестирования, прежде чем вы начнете импортировать документацию, вы можете выполнить следующую задачу установки:

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__, как вы видите выше, дает действительно простой код).

...