Question

S'il vous plaît aidez-moi à une console ipython intégré pour fonctionner dans un doctest. Le code exemple illustre le problème et se bloque votre terminal. Le shell bash type I ctrl-Z puis tuer% 1 de sortir et de tuer, puisque ctrl-C ne fonctionnera pas.

def some_function():
    """
    >>> some_function()
    'someoutput'
    """
    # now try to drop into an ipython shell to help 
    # with development
    import IPython.Shell; IPython.Shell.IPShellEmbed(argv=[])()
    return 'someoutput'

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

J'aime utiliser ipython pour aider le code d'écriture. Une astuce courante consiste à utiliser ipython comme un 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 il ne fonctionne pas dans doctests. Je pense qu'il a à voir avec le contrôle doctest stdin / stdout.

Merci d'avance pour votre aide. - Philip

Était-ce utile?

La solution

Je leur ai envoyé un groupe d'utilisateurs ipython et a obtenu un peu d'aide. Il y a maintenant un pour obtenir cette fonctionnalité dans des versions futures de 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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top