2009-12-31 10 views
3

Aidez-moi à utiliser une console ipython intégrée pour exécuter un doctest. L'exemple de code montre le problème et va bloquer votre terminal. Sur shell bash, je tape ctrl-Z et ensuite tue% 1 pour sortir et tuer, car ctrl-C ne fonctionnera pas. J'aime utiliser ipython pour aider à écrire du code. Une astuce courante consiste à utiliser ipython comme point d'arrêt dans mon code en appelant IPython.Shell.IPShellEmbed. Cette astuce fonctionne partout où j'ai essayé (dans un django manage.py runserver, tests unitaires), mais cela ne fonctionne pas dans les doctests. Je pense que cela a à voir avec doctest contrôlant stdin/stdout.Comment utiliser IPShellEmbed d'ipython depuis un doctest en cours d'exécution

Merci d'avance pour votre aide. - Philip

Répondre

0

J'ai envoyé un e-mail au groupe d'utilisateurs ipython et j'ai obtenu de l'aide. Il y a maintenant un support ticket pour que cette fonctionnalité soit corrigée dans les futures versions d'ipython. Voici un extrait de code avec une solution de contournement:

import sys 

from IPython.Shell import IPShellEmbed 

class IPShellDoctest(IPShellEmbed): 
    def __call__(self, *a, **kw): 
     sys_stdout_saved = sys.stdout 
     sys.stdout = sys.stderr 
     try: 
      IPShellEmbed.__call__(self, *a, **kw) 
     finally: 
      sys.stdout = sys_stdout_saved 


def some_function(): 
    """ 
    >>> some_function() 
    'someoutput' 
    """ 
    # now try to drop into an ipython shell to help 
    # with development 
    IPShellDoctest()(local_ns=locals()) 
    return 'someoutput' 

if __name__ == '__main__': 
    import doctest 
    print "Running doctest . . ." 
    doctest.testmod() 
+0

Si vous ne se soucient pas de remise à zéro stdout, vous pouvez sauter toute la classe 'IPShellDoctest' et juste régler manuellement' sys.stdout = sys.stderr' avant d'appeler 'IPShellEmbed'. En général, j'ai un 'sys.exit()' dans mon code juste après le 'IPShellEmbed' de toute façon. – Gattster