Wie erzwinge ich einen Importeur auf Entwicklungsmaschine? (PWD -Modul)
-
20-09-2019 - |
Frage
Ich versuche, eine LIB von Drittanbietern (DOCUTILS) in Google App Engine zu verwenden, und habe ein Problem mit diesem Code (in DOCUTILS):
try:
import pwd
do stuff
except ImportError:
do other stuff
Ich möchte, dass der Import fehlschlägt, wie auf dem tatsächlichen GAE -Server, aber das Problem ist, dass er in meinem Entwicklungsfeld (Ubuntu) nicht fehlschlägt. Wie kann es scheitern, da der Import nicht in meinem eigenen Code liegt?
Lösung
Noch einfacher, als miteinander zu spielen __import__
Fügt sich nur ein None
im sys.modules dikt:
>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pwd
Andere Tipps
In Ihrem Test -Framework können Sie diese Setup -Aufgabe ausführen:
import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
if name=='pwd': raise ImportError
return self.savimport(name, *a)
__builtin__.__import__ = myimport
Und natürlich in Teardown die Dinge wieder normalisiert:
__builtin__.__import__ = self.savimport
Erläuterung: Alle Importoperationen gehen durch __builtin__.__import__
, und Sie können diesen Namen neu zuweisen, damit solche Operationen Ihren eigenen Code verwenden (Alternativen wie Importhaken sind für solche Zwecke besser wie die Durchführung von Imports aus Nicht-Akte-Quellen, jedoch für Zwecke wie Ihre, die überschreiben __builtin__.__import__
, Wie Sie oben sehen, bietet ein wirklich einfacher Code).