¿Cómo forzar un importador en la máquina de desarrollo? (Módulo PWD)
-
20-09-2019 - |
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?
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).