Как заставить импортеррору на машине разработки? (модуль PWD)
-
20-09-2019 - |
Вопрос
Я пытаюсь использовать стороннюю LIB (Docutils) в Google App Engine и у меня есть проблемы с этим кодом (в Docutils):
try:
import pwd
do stuff
except ImportError:
do other stuff
Я хочу, чтобы импорт не удался, как и на фактическом сервере GAE, но проблема в том, что он не выйдет из строя в моем ящике для разработки (Ubuntu). Как сделать его неудачу, учитывая, что импорт не в моем собственном коде?
Решение
Даже проще, чем возиться с __import__
просто вставлен None
В Sys.Modules DICT:
>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pwd
Другие советы
В вашей структуре тестирования, прежде чем вы заставите импортировать документы, вы можете выполнить эту задачу настройки:
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__
, и вы можете переназначить это имя, чтобы такие операции использовали свой собственный код (альтернативы, такие как импортные крючки, лучше для таких целей, как выполнение импорта из источников, не связанных с Filesystem, но для таких целей, как ваши, переопределите __builtin__.__import__
, как вы видите выше, дает действительно простой код).