notebook - Buscar en el historial de ipython
jupyter desde anaconda (7)
ipython %his
ipython genera comandos recientes ingresados por el usuario. ¿Es posible buscar dentro de estos comandos? Algo como esto:
[c for c in %history if c.startswith(''plot'')]
EDITAR No estoy buscando una forma de volver a ejecutar un comando, sino de localizarlo en la lista de historial. Por supuesto, a veces querré volver a ejecutar un comando después de localizarlo, ya sea textualmente o con modificaciones.
EDITAR la búsqueda con ctr-r
y luego escribir plot
da el comando más reciente que comienza con "plot". No listará todos los comandos que comiencen con él. Tampoco puedes buscar en el medio o al final de los comandos
Solución
Ampliando la solución de PreludeAndFugue aquí, lo que estaba buscando:
[l for l in _ih if l.startswith(''plot'')]
Aquí, la condición if
puede ser sustituida por una expresión regular.
Aún mejor: %hist -g |pattern|
codicia su historia pasada para |pattern|
. Además, puede restringir su búsqueda a la sesión actual o a un rango particular de líneas. Ver %hist?
Así que para la pregunta de @BorisGorelik tendrías que hacer
%hist -g plot
Desafortunadamente no puedes hacer
%hist -g ^plot
ni
%hist -g "^plot"
Al igual que en la primera respuesta puedes hacer lo siguiente:
''''.join(_ih).split(''/n'')
Sin embargo, al recorrer los elementos del historial de comandos, puede hacer lo siguiente. De esta forma puedes crear tu lista de comprensión a partir de esto.
for item in _ih:
print item
Esto se documenta en la siguiente sección de la documentación: http://ipython.org/ipython-doc/dev/interactive/reference.html#input-caching-system
Generalmente me encuentro con ganas de buscar en todo el historial de ipython en todas las sesiones anteriores y actuales. Para esto yo uso:
from IPython.core.history import HistoryAccessor
hista = HistoryAccessor()
z1 = hista.search(''*numpy*corr*'')
z1.fetchall()
O (no ejecute ambos o dañará / borrará su historial)
ip = get_ipython()
sqlite_cursor = ip.history_manager.search(''*numpy*corr*'')
sqlite_cursor.fetchall()
La cadena de búsqueda no es una expresión regular. IPython history_manager usa la sintaxis de búsqueda glob *
sqlite.
Hay una forma de hacerlo:
''''.join(_ip.IP.shell.input_hist).split(''/n'')
o
''''.join(_ip.IP.shell.input_hist_raw).split(''/n'')
para evitar la expansión de magia.
Si desea volver a ejecutar un comando en su historial, pruebe Ctrl-r
y luego su cadena de búsqueda.
from IPython.core.history import HistoryAccessor
def search_hist(pattern,
print_matches=True,
return_matches=True,
wildcard=True):
if wildcard:
pattern = ''*'' + pattern + ''*''
matches = HistoryAccessor().search(pattern).fetchall()
if not print_matches:
return matches
for i in matches:
print(''#'' * 60)
print(i[-1])
if return_matches:
return matches
%history [-n] [-o] [-p] [-t] [-f FILENAME] [-g [PATTERN [PATTERN ...]]]
[-l [LIMIT]] [-u]
[range [range ...]]
....
-g <[PATTERN [PATTERN …]]>
treat the arg as a glob pattern to search for in (full) history. This includes the saved history (almost all commands ever written). The pattern may contain ‘?’ to match one unknown character and ‘*’ to match any number of unknown characters. Use ‘%hist -g’ to show full saved history (may be very long).
Ejemplo (en mi historia):
In [23]: hist -g cliente*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})
Ejemplo (en mi historia):
In [24]: hist -g ?lie*aza
655/58: cliente.test.alguna.update({"orden" : 1, "nuevo" : "azafran"})
655/59: cliente.test.alguna.update({"orden" : 1} , {$set : "nuevo" : "azafran"})
655/60: cliente.test.alguna.update({"orden" : 1} , {$set : {"nuevo" : "azafran"}})