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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top