In an IPython terminal, I want a function deep in main()
to go back to IPython, where I can print, set ... as usual, then keep running main()
:
IPython
run main.py
...
def callback( *args ):
...
try:
back_to_ipython() # <-- how to do this ?
In[]: print, set *args ...
...
except KeyboardInterrupt: # or IPython magic
pass
return # from callback(), keep running main()
This must run in python2.
(The name callback
could be anything
, but my use case is scipy.optimize -> callback.
Perhaps some clever scipy person has done this ?)
Added Tuesday 11 Oct: thanks for
embed
,
but it seems to run into a bug, or my misunderstanding:
# http://stackoverflow.com/questions/39946052/how-to-coroutine-ipython-a-callback
import sys
from IPython import __version__
from IPython import embed # $site/IPython/terminal/embed.py
from IPython.terminal.ipapp import load_default_config
print "versions: IPython %s python %s" % (
__version__, sys.version.split()[0] )
def pdict( header, adict ):
print header
for k, v in sorted( adict.items() ):
print "%s\t: %s" % (k, v)
config = load_default_config()
pdict( "load_default_config:", config )
aglobal = [3]
#...............................................................................
def callback( adict ):
# pdict( "callback:", adict )
t = adict["t"]
x = 3
embed( header="callback: t %d" % t )
# interact: print t x ...
# ^D / EOF
return
def aloop( *args ):
for t in range( 3 ):
callback( locals() )
aloop( 1, 2, 3 ) # works in "run this.py"
# but typing "aloop()" in an IPython terminal ->
# embed.py:218: UserWarning: Failed to get module unknown module
# global_ns.get('__name__', 'unknown module')