Как обработать IPython <-> обратный вызов ()

В терминале IPython я хочу, чтобы функция в main() возвращалась в IPython, где я могу печатать, устанавливать … как обычно, а затем продолжать работать 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() 

Это должно выполняться в python2.

( callback имени может быть anything , но мой вариант использования – scipy.optimize -> callback. Возможно, какой-то умный scipy человек сделал это?)


Добавлено вторник 11 октября: спасибо за embed , но похоже, что он попал в ошибку или мое недоразумение:

 # 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 tx ... # ^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') 

2 Solutions collect form web for “Как обработать IPython <-> обратный вызов ()”

Вы можете вставить точку останова, которая даст аналогичный результат:

 import pdb; pdb.set_trace() 

https://docs.python.org/3.6/library/pdb.html

Альтернатива здесь embed() функция embed() в iPython): Пошаговая отладка с помощью IPython

Адаптировав ответ на https://stackoverflow.com/a/24827245/901925 , я добавил в него вставку Ipython ( https://ipython.org/ipython-doc/3/api/generated/IPython.terminal.embed.html )

 import numpy as np from scipy.optimize import minimize, rosen import time import warnings from IPython import embed class TookTooLong(Warning): pass class MinimizeStopper(object): def __init__(self, max_sec=60): self.max_sec = max_sec self.start = time.time() def __call__(self, xk=None): elapsed = time.time() - self.start if elapsed > self.max_sec: embed(header='FirstTime') warnings.warn("Terminating optimization: time limit reached", TookTooLong) else: # you might want to report other stuff here print("Elapsed: %.3f sec" % elapsed) # example usage x0 = [1.3, 0.7, 0.8, 1.9, 1.2] res = minimize(rosen, x0, method='Nelder-Mead', callback=MinimizeStopper(1E-3)) 

с пробегом как:

 1251:~/mypy$ python3 stack39946052.py Elapsed: 0.001 sec Python 3.5.2 (default, Jul 5 2016, 12:43:10) Type "copyright", "credits" or "license" for more information. IPython 5.1.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. FirstTime In [1]: xk Out[1]: array([ 1.339, 0.721, 0.824, 1.71 , 1.236]) In [2]: elapsed Out[2]: 0.0010917186737060547 In [3]: self.max_sec Out[3]: 0.001 In [4]: self.max_sec=1000 In [5]: Do you really want to exit ([y]/n)? y stack39946052.py:20: TookTooLong: Terminating optimization: time limit reached TookTooLong) .... 
  • Импортирование многопроцессорных прерываний в Python
  • эквивалент scipy.interpolate.griddata в CUDA
  • Двоичное хранение значений с плавающей запятой (от 0 до 1) с использованием менее 4 байтов?
  • Как рассортировать дистрибутив scipy.stats (не может сортировать объекты instancemethod)
  • Эффективно накапливается коллекция редких scipy-матриц
  • Быстрый алгоритм b-сплайна с numpy / scipy
  • Matplotlib - ступенчатая гистограмма с уже закодированными данными
  • Python с Numpy / Scipy против чистого C ++ для анализа больших данных
  • Python - лучший язык программирования в мире.