Pregunta

Estoy tratando de usar una libra de terceros (Docutils) en Google App Engine y tengo un problema con este código (en Docutils):

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

Quiero que la importación falle, como lo hará en el servidor GAE real, pero el problema es que no falla en mi cuadro de desarrollo (Ubuntu). ¿Cómo hacer que falle, dado que la importación no está en mi propio código?

¿Fue útil?

Solución

Incluso más fácil que meterse con __import__ es solo insertar None En el 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

Otros consejos

En su marco de prueba, antes de que se importen los docutilos, puede realizar esta tarea de configuración:

import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
  if name=='pwd': raise ImportError
  return self.savimport(name, *a)
__builtin__.__import__ = myimport

Y, por supuesto, en la desmayo volver a poner las cosas a la normalidad:

__builtin__.__import__ = self.savimport

Explicación: todas las operaciones de importación pasan __builtin__.__import__, y puede reasignar ese nombre para que tales operaciones usen su propio código (alternativas como los ganchos de importación son mejores para fines como realizar la importación de fuentes que no sean de archivos, pero para fines como el suyo, anulando __builtin__.__import__, como se ve arriba, ofrece un código verdaderamente simple).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top