Comment forcer une ImportError sur la machine de développement? (Module de PWD)
-
20-09-2019 - |
Question
Je suis en train d'utiliser un lib tiers (docutils) sur Google App Engine et ont un problème avec ce code (en docutils):
try:
import pwd
do stuff
except ImportError:
do other stuff
Je veux l'importation à l'échec, car il sur le serveur GAE réel, mais le problème est qu'il ne manque pas sur ma boîte de développement (ubuntu). Comment faire échouer, étant donné que l'importation est pas dans mon propre code?
La solution
Encore plus facile que de jouer avec __import__
est juste insérait None
dans les 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
Autres conseils
Dans votre cadre de tests, avant que vous causez docutils à importer, vous pouvez effectuer cette tâche de configuration:
import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
if name=='pwd': raise ImportError
return self.savimport(name, *a)
__builtin__.__import__ = myimport
et bien sûr mis en teardown les choses à la normale:
__builtin__.__import__ = self.savimport
Explication: toutes les opérations d'importation passent par __builtin__.__import__
, et vous pouvez réattribuer ce nom d'avoir de telles opérations utilisent votre propre code (alternatives tels que des crochets d'importation sont mieux à ces fins que l'exécution importation de sources non système de fichiers, mais à des fins telles comme le vôtre, __builtin__.__import__
primordial, comme vous le voyez ci-dessus, offre un code vraiment simple requise).