Comment utiliser IPShellEmbed de ipython à partir d'un doctest en cours d'exécution
-
22-09-2019 - |
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
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()