Come forzare un ImportError sulla macchina di sviluppo? (Modulo pwd)
-
20-09-2019 - |
Domanda
Sto cercando di utilizzare un lib di terze parti (docutils) su Google App Engine e hanno un problema con questo codice (in docutils):
try:
import pwd
do stuff
except ImportError:
do other stuff
Voglio l'importazione a fallire, in quanto sul server reale GAE, ma il problema è che non manca sulla mia casella di sviluppo (ubuntu). Come rendere fallire, dato che l'importazione non è nel mio codice?
Soluzione
Ancora più facile di fare scherzi con __import__
è solo inserendo None
nelle 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
Altri suggerimenti
Nel vostro ambiente di test, prima di causare docutils da importare, è possibile eseguire questa operazione di installazione:
import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
if name=='pwd': raise ImportError
return self.savimport(name, *a)
__builtin__.__import__ = myimport
e naturalmente in teardown rimettere le cose alla normalità:
__builtin__.__import__ = self.savimport
Spiegazione: tutte le operazioni di importazione passano attraverso __builtin__.__import__
, ed è possibile riassegnare quel nome di avere tali operazioni utilizzare il tuo codice proprio (alternative quali ganci di importazione sono migliori per tali scopi, come l'esecuzione di importazione da fonti non filesystem, ma per esempio a fini come la tua, __builtin__.__import__
prioritario, come vedete sopra, si permette il codice veramente semplice).