2010-02-13 6 views
4

J'essaie d'utiliser un lib tiers (docutils) sur Google App Engine et ont un problème avec ce code (en docutils):Comment forcer une ImportError sur une machine de développement? (Module PWD)

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

Je veux l'importation à l'échec, comme il le fera sur le serveur GAE réel, mais le problème est qu'il n'échoue pas sur ma boîte de développement (ubuntu). Comment le faire échouer, étant donné que l'importation n'est pas dans mon propre code?

Répondre

7

encore plus facile que de jouer avec __import__ est juste dans les None INSERTION DE 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 
+0

Et j'ai réalisé que les fonctionnalités cachées de la question Python manquaient celle-ci, donc je l'ai ajouté là aussi: http://stackoverflow.com/questions/101268/hidden-features-of-python/2259080#2259080 –

+0

Parfait. Ça a marché. Merci d'avoir répondu. – jerd

4

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 dans les choses de vente teardown retour à la normale:

__builtin__.__import__ = self.savimport 

Explication : toutes les opérations d'importation passent par __builtin__.__import__ et vous pouvez réaffecter ce nom pour que ces opérations utilisent votre propre code (des alternatives telles que les hooks d'importation sont plus utiles pour l'importation de sources non-système de fichiers, mais à des fins comme la vôtre, overrid __builtin__.__import__, comme vous le voyez ci-dessus, offre un code vraiment simple).

+0

Merci pour la réponse rapide, qui ressemble à cela devrait faire l'affaire. – jerd

+0

Malheureusement, cela n'a pas fonctionné - c'est peut-être une chose AppEngine? En tout cas, la méthode de Thomas Wouters a fait ce que je voulais. Bonne chance. – jerd

+0

Cela ne fonctionnerait pas dans App Engine - mais dans App Engine 'import pwd' échoue juste, vous n'avez donc pas besoin de cela pour fonctionner dans App Engine lui-même, mais plutôt _outside_ de celui-ci lorsque vous le simulez pour tester . Pourtant, la réponse de Thomas est plus simple et plus courte, ce qui le rend plus adapté, donc je suis d'accord avec votre choix (et je vais lui donner +1 - souvenez-vous de revenir et de faire la même chose quand votre réputation se développera suffisamment pour le permettre! -). –