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?

È stato utile?

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).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top