{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "En la primera entrega vimos como usar la ayuda de IPython y como personalizar nuestras propias funciones m\u00e1gicas de ayuda.\n", "\n", "En esta segunda entrega vamos a hablar del uso de la historia dentro de IPython.\n", "\n", "IPython guarda la historia de los comandos que se usan en cada l\u00ednea/celda de cada sesi\u00f3n bajo un determinado perfil. Esta informaci\u00f3n se guarda en una base de datos sqlite. Por defecto, se guardan el inicio y fin de sesi\u00f3n, los comandos usados en cada sesi\u00f3n y algunos metadatos m\u00e1s. IPython tambi\u00e9n se puede configurar para que almacene los outputs." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "Historia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La base de datos con la historia se guarda en la carpeta que obten\u00e9is haciendo lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "from IPython.utils import path\n", "path.locate_profile()" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "'/home/kiko/.config/ipython/profile_default'" ] } ], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y la base de datos se guardar\u00e1 en esa carpeta con el nombre *history.sqlite*.\n", "\n", "Una forma alternativa de obtener la ruta a la historia bajo el perfil actual es usando lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "get_ipython().history_manager.hist_file" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 2, "text": [ "'/home/kiko/.config/ipython/profile_default/history.sqlite'" ] } ], "prompt_number": 2 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Acceso a determinadas celdas de la historia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para reusar comandos ya usados podemos hacer uso de la `historia` que guarda IPython en cada sesi\u00f3n.\n", "\n", "- Podemos usar las teclas de cursor hacia arriba o hacia abajo para recorrer los \u00faltimos comandos usados (esto no funciona en el notebook pero s\u00ed en la consola de IPython).\n", "\n", "- Si escribimos algo en la l\u00ednea de comandos y pulsamos el cursor hacia arriba nos mostrar\u00e1 solo lo que comience por lo ya escrito en la l\u00ednea de comandos (nuevamente, esto no funciona en el notebook pero s\u00ed en la consola de IPython).\n", "\n", "- En las sesiones interactivas, el input y el output se guarda en las variables In y Out. Poniendo el \u00edndice de la l\u00ednea usada nos volver\u00e1 a ejecutar esa l\u00ednea, en el caso de que usemos la variable In o nos mostrar\u00e1 el output en caso de que usemos la variable Out. In es una lista mientras que Out es un diccionario. En el caso de que no haya output para un n\u00famero de l\u00ednea nos dar\u00e1 un KeyError. Por ejemplo, veamos las siguientes celdas de c\u00f3digo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "In?" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 3 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nos mostrar\u00e1 en pantalla lo siguiente:\n", "\n", " Type: list\n", " String Form:['', 'a = 3', 'a = 1', \"get_ipython().magic('pinfo In')\", \"get_ipython().magic('pinfo In')\"]\n", " Length: 5\n", " Docstring:\n", " list() -> new empty list\n", " list(iterable) -> new list initialized from iterable's items\n", " \n", "Mientras que si hacemos lo mismo para `Out` obtendremos la siguiente info:\n", "\n", " Type: dict\n", " String Form:{}\n", " Length: 0\n", " Docstring:\n", " dict() -> new empty dictionary\n", " dict(mapping) -> new dictionary initialized from a mapping object's\n", " (key, value) pairs\n", " dict(iterable) -> new dictionary initialized as if via:\n", " d = {}\n", " for k, v in iterable:\n", " d[k] = v\n", " dict(**kwargs) -> new dictionary initialized with the name=value pairs\n", " in the keyword argument list. For example: dict(one=1, two=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si ahora hacemos lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a = 2" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 4 }, { "cell_type": "code", "collapsed": false, "input": [ "print(a)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2\n" ] } ], "prompt_number": 5 }, { "cell_type": "code", "collapsed": false, "input": [ "Out" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 6, "text": [ "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite'}" ] } ], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vemos que en `Out` se encuentra lo que hemos obtenido en las primeras celdas de c\u00f3digo. Si ahora queremos ver otro output podemos hacer lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "a" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 7, "text": [ "2" ] } ], "prompt_number": 7 }, { "cell_type": "code", "collapsed": false, "input": [ "Out" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 8, "text": [ "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite',\n", " 7: 2}" ] } ], "prompt_number": 8 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vemos que ya tenemos alg\u00fan valor para el `Out` y ya podremos acceder a ese valor por si lo quisi\u00e9ramos usar en alguna otra celda. Por ejemplo, de la siguiente forma:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "b = Out[7]" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 9 }, { "cell_type": "code", "collapsed": false, "input": [ "print(b)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "2\n" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como el `In` siempre lo tendremos, en lugar de ser un diccionario es una lista y podemos acceder al valor de la celda usando el \u00edndice de la misma. Por ejemplo:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "for celda in In:\n", " print(celda)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "\n", "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "get_ipython().magic('pinfo In')\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[7]\n", "print(b)\n", "for celda in In:\n", " print(celda)\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tambi\u00e9n podemos acceder a los tres \u00faltimos outputs de las tres \u00faltimas celdas usando \\_, \\_\\_, \\_\\_\\_, que nos mostrar\u00e1 el output de la \u00faltima, pen\u00faltima o antepen\u00faltima celdas usadas, respectivamente." ] }, { "cell_type": "code", "collapsed": false, "input": [ "print('antepen\u00faltima:\\n', ___, '\\n\\n')\n", "print('pen\u00faltima:\\n', __, '\\n\\n')\n", "print('\u00faltima:\\n', _, '\\n\\n')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "antepen\u00faltima:\n", " /home/kiko/.config/ipython/profile_default \n", "\n", "\n", "pen\u00faltima:\n", " /home/kiko/.config/ipython/profile_default/history.sqlite \n", "\n", "\n", "\u00faltima:\n", " 2 \n", "\n", "\n" ] } ], "prompt_number": 12 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos acceder a los inputs de las \u00faltimas celdas podemos usar algo parecido pero de la siguiente forma, \\_i, \\_ii o \\_iii para la \u00faltima, pen\u00faltima o antepen\u00faltima celda de input:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print('antepen\u00faltima:\\n', _iii, '\\n\\n')\n", "print('pen\u00faltima:\\n', _ii, '\\n\\n')\n", "print('\u00faltima:\\n', _i, '\\n\\n')" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "antepen\u00faltima:\n", " print(b) \n", "\n", "\n", "pen\u00faltima:\n", " for celda in In:\n", " print(celda) \n", "\n", "\n", "\u00faltima:\n", " print('antepen\u00faltima:\\n', ___, '\\n\\n')\n", "print('pen\u00faltima:\\n', __, '\\n\\n')\n", "print('\u00faltima:\\n', _, '\\n\\n') \n", "\n", "\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "An\u00e1logamente a lo visto anteriormente, podemos usar \\_*n* o \\_i*n* para mostrar, respectivamente, el output o el input de la celda *n*. Por ejemplo, para ver el input y el output de la celda anterior (en este caso ser\u00eda la 11) podemos hacer lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "print('El input de la celda 11 es:')\n", "print(_i11)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "El input de la celda 11 es:\n", "for celda in In:\n", " print(celda)\n" ] } ], "prompt_number": 14 }, { "cell_type": "code", "collapsed": false, "input": [ "print('Te he enga\u00f1ado. No existe output para la celda 11')\n", "print('Si intentas acceder al valor _11 obtendr\u00e1s un NameError ya que no existe la variable')\n", "print('pero te puedo ense\u00f1ar el de la celda 7:')\n", "print(_7)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Te he enga\u00f1ado. No existe output para la celda 11\n", "Si intentas acceder al valor _11 obtendr\u00e1s un NameError ya que no existe la variable\n", "pero te puedo ense\u00f1ar el de la celda 7:\n", "2\n" ] } ], "prompt_number": 15 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo anterior es equivalente a usar `In[n]` o `Out[n]`. Una tercera alternativa, adem\u00e1s, ser\u00eda usar \\_ih[*n*] para los inputs y \\_oh[*n*] para los outputs." ] }, { "cell_type": "code", "collapsed": false, "input": [ "In[11]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 16, "text": [ "'for celda in In:\\n print(celda)'" ] } ], "prompt_number": 16 }, { "cell_type": "code", "collapsed": false, "input": [ "_ih[11]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 17, "text": [ "'for celda in In:\\n print(celda)'" ] } ], "prompt_number": 17 }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Acceso a bloques de historia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para acceder a toda la historia de la sesi\u00f3n actual podemos usar las funciones m\u00e1gicas `%history` o `%hist`, que es un alias. \n", "\n", "Podemos obtener toda la historia o solo una porci\u00f3n. Por ejemplo, el siguiente comando nos mostrar\u00e1 la historia desde la celda 1 a la 10 en la sesi\u00f3n actual:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist 1-10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "In?\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[7]\n", "print(b)\n" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si, adem\u00e1s de acceder a las celdas 1 a 10, queremos acceder a celdas sueltas podemos usar la siguiente notaci\u00f3n para acceder a las celdas 12 y 14 (adem\u00e1s de a las 10 primeras)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist 1-10 12 14" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "In?\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[7]\n", "print(b)\n", "print('antepen\u00faltima:\\n', ___, '\\n\\n')\n", "print('pen\u00faltima:\\n', __, '\\n\\n')\n", "print('\u00faltima:\\n', _, '\\n\\n')\n", "print('El input de la celda 11 es:')\n", "print(_i11)\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si ahora queremos acceder a todas las celdas donde hayamos usado, por ejemplo, un comando que incluya '`a = 1`' podemos hacer uso de la opci\u00f3n `-g` (similar a `grep`) de la siguiente forma:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist -g a = 1" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "29/129: a = 1\n", "29/133: a = 1\n", "29/136: a = 1.1\n", "29/138: a = 1\n", "29/142: a = 1.1\n", "29/145: a = 1\n", "29/147: a = 1\n", "29/149: a = 1\n", "29/151: a = 1\n", "51/7: a = 1\n", "185/1: a = 1\n", "187/19: %hist -g a = 1\n", "187/20: %hist -g [a = 1]\n", "187/21: %hist -g a = 1\n", "188/20: %hist -g a = 1\n", "189/2: a = 1\n", "190/1: a = 1\n", "190/3: a = 1\n", "190/4: a = 1\n", "190/10: a = 1\n", "201/1:\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a = 1:\n", " print(a)\n", " elseif a =2:\n", " print(a)\n", " else:\n", " print('kk')\n", " return None\n", "\n", "\"\"\"\n", "201/3:\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a = 1:\n", " print(a)\n", " elif a =2:\n", " print(a)\n", " else:\n", " print('kk')\n", " return None\n", "\n", "\"\"\"\n", "201/5:\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a = 1:\n", " print(a)\n", " elif a = 2:\n", " print(a)\n", " else:\n", " print('kk')\n", " return None\n", "\n", "\"\"\"\n", "201/14:\n", "a = 1\n", "b = exec(code)\n", "201/15:\n", "a = 1\n", "b = exec(code)\n", "print(b)\n", "201/16:\n", "a = 1\n", "b = exec(code)\n", "print(c)\n", "201/17:\n", "a = 1\n", "b = exec(code)\n", "print(b)\n", "201/43: def a():a = 1;return a\n", "201/45: def a():a = 1;b=2return a\n", "201/46: def a():a = 1;b=2;return a,b\n", "201/81:\n", "a = 1\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a == 1:\n", " print('a=1')\n", " elif a == 2:\n", " print('a=2')\n", " else:\n", " if a == 3:\n", " print('a=3')\n", " return None\n", "\n", "\"\"\"\n", "201/85:\n", "a = 1\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a == 1:\n", " print('a=1')\n", " elif a == 2:\n", " print('a=2')\n", " else:\n", " if a == 3:\n", " print('a=3')\n", " return None\n", "\n", "\"\"\"\n", "201/93:\n", "a = 1\n", "code = \"\"\"\n", "\n", "def hello():\n", " if a == 1:\n", " return('a=1')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "\"\"\"\n", "201/135:\n", "a = 2\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "hello()\n", "\n", "\"\"\"\n", "201/157:\n", "a = 2\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " \"\"\"Hola\"\"\"\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", " \n", "class A():\n", " \"\"\"Hola\"\"\"\n", " def __init__(self):\n", " \"Hola\"\n", " \n", " def _kk(self):\n", " 'Adios'\n", "\n", "hello()\n", "help(A)\n", "\n", "\"\"\"\n", "201/158:\n", "a = 2\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''Hola'''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", " \n", "class A():\n", " \"\"\"Hola\"\"\"\n", " def __init__(self):\n", " \"Hola\"\n", " \n", " def _kk(self):\n", " 'Adios'\n", "\n", "hello()\n", "help(A)\n", "\n", "\"\"\"\n", "201/159:\n", "a = 2\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''Hola'''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", " \n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", " \n", " def _kk(self):\n", " 'Adios'\n", "\n", "hello()\n", "help(A)\n", "\n", "\"\"\"\n", "201/174:\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''\n", " Hola\n", " '''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", " \n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", " \n", " def _kk(self):\n", " 'Adios'\n", "\n", "hello()\n", "help(A)\n", "\n", "\"\"\"\n", "201/219:\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''\n", " Hola\n", " '''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", "\n", " def _kk(self):\n", " 'Adios'\n", "\n", "print(hello())\n", "help(A)\n", "\n", "\"\"\"\n", "201/230:\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''\n", " Hola\n", " '''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", "\n", " def _kk(self):\n", " 'Adios'\n", " pass\n", "\n", "print(hello())\n", "help(A)\n", "\n", "\"\"\"\n", "201/233:\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''\n", " Hola\n", " '''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", "\n", " def _kk(self):\n", " 'Adios'\n", " pass\n", "\n", "print(hello())\n", "help(A)\n", "\n", "\"\"\"\n", "201/237:\n", "code = \"\"\"\n", "a = 1\n", "def hello():\n", " '''\n", " Hola\n", " '''\n", " # esto es un comentario de mierda\n", " if a == 1:\n", " # esto es otro comentario\n", " return('a=1 # esto no ser\u00eda un comentario')\n", " elif a == 2:\n", " return('a=2')\n", " else:\n", " if a == 3:\n", " return('a=3')\n", " return None\n", "\n", "class A():\n", " \"Hola\"\n", " def __init__(self):\n", " \"Hola\"\n", " pass\n", "\n", " def _kk(self):\n", " 'Adios'\n", " pass\n", "\n", "print(hello())\n", "help(A)\n", "\n", "\"\"\"\n", "202/2: a = 1\n", "202/3: a = 1\n", "202/4: a = 1\n", "202/5:\n", "a = 1\n", "print(a)\n", "214/20: %hist -g a = 1\n", " 20: %hist -g a = 1\n" ] } ], "prompt_number": 20 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pero esta busqueda no se restringe a la historia de la sesi\u00f3n actual sino que buscar\u00e1 en toda la historia almacenada por IPython bajo el perfil que estemos usando. El anterior output indica la sesi\u00f3n, el n\u00famero de l\u00ednea/celda de esa sesi\u00f3n y el c\u00f3digo usado en esa l\u00ednea/celda:\n", "\n", "*Sesi\u00f3n/celda: C\u00f3digo_introducido_en_la_celda*\n", "\n", "En este caso, pod\u00e9is ver que en la \u00faltima l\u00ednea no se indica el n\u00famero de sesi\u00f3n puesto que se refiere a la sesi\u00f3n actual:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si usamos la opci\u00f3n `-o` tambi\u00e9n obtendremos la historia con el output incluido. Pod\u00e9is ver el siguiente ejemplo para ver como funciona:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist -o" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "'/home/kiko/.config/ipython/profile_default'\n", "get_ipython().history_manager.hist_file\n", "'/home/kiko/.config/ipython/profile_default/history.sqlite'\n", "In?\n", "a = 2\n", "print(a)\n", "Out\n", "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite'}\n", "a\n", "2\n", "Out\n", "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite',\n", " 7: 2}\n", "b = Out[7]\n", "print(b)\n", "for celda in In:\n", " print(celda)\n", "print('antepen\u00faltima:\\n', ___, '\\n\\n')\n", "print('pen\u00faltima:\\n', __, '\\n\\n')\n", "print('\u00faltima:\\n', _, '\\n\\n')\n", "print('antepen\u00faltima:\\n', _iii, '\\n\\n')\n", "print('pen\u00faltima:\\n', _ii, '\\n\\n')\n", "print('\u00faltima:\\n', _i, '\\n\\n')\n", "print('El input de la celda 11 es:')\n", "print(_i11)\n", "print('Te he enga\u00f1ado. No existe output para la celda 11')\n", "print('Si intentas acceder al valor _11 obtendr\u00e1s un NameError ya que no existe la variable')\n", "print('pero te puedo ense\u00f1ar el de la celda 7:')\n", "print(_7)\n", "In[11]\n", "'for celda in In:\\n print(celda)'\n", "_ih[11]\n", "'for celda in In:\\n print(celda)'\n", "%hist 1-10\n", "%hist 1-10 12 14\n", "%hist -g a = 1\n", "%hist -o\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Otra cosa interesante es la opci\u00f3n `-p`, que coloca un *prompt* delante de cada l\u00ednea de la historia que se muestra. Esto puede ser \u00fatil para, por ejemplo, escribir doctests.\n", "\n", "En el siguiente ejemplo vamos a usar la opci\u00f3n `-p` junto con la opci\u00f3n `-o`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist -po 1-10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ ">>> from IPython.utils import path\n", "... path.locate_profile()\n", "...\n", "'/home/kiko/.config/ipython/profile_default'\n", ">>> get_ipython().history_manager.hist_file\n", "'/home/kiko/.config/ipython/profile_default/history.sqlite'\n", ">>> In?\n", ">>> a = 2\n", ">>> print(a)\n", ">>> Out\n", "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite'}\n", ">>> a\n", "2\n", ">>> Out\n", "{1: '/home/kiko/.config/ipython/profile_default',\n", " 2: '/home/kiko/.config/ipython/profile_default/history.sqlite',\n", " 7: 2}\n", ">>> b = Out[7]\n", ">>> print(b)\n" ] } ], "prompt_number": 22 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos guardar la historia o parte de la historia en un fichero para, por ejemplo, los doctests, podemos usar la opci\u00f3n `-f`.\n", "\n", "Con la siguiente l\u00ednea de c\u00f3digo vamos a guardar el input, el output y vamos a colocar la l\u00ednea del *prompt* de las 10 primeras celdas en un fichero llamado *kk.txt*:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist 1-10 -pof kk.txt" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 23 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si queremos acceder a la historia de una sesi\u00f3n anterior podemos usar lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist ~1/1-10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "In?\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[7]\n", "print(b)\n" ] } ], "prompt_number": 24 }, { "cell_type": "markdown", "metadata": {}, "source": [ "De esta forma accederemos a las 10 primeras l\u00edneas de la sesi\u00f3n anterior. Si queremos acceder a las 10 primeras l\u00edneas de la pen\u00faltima sesi\u00f3n podemos hacer:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist ~2/1-10" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "In?\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[9]\n" ] } ], "prompt_number": 25 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si, adem\u00e1s, quer\u00e9is numerar las celdas usadas pod\u00e9is usar la opci\u00f3n `-n`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist ~2/1-10 -n" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "213/1:\n", "from IPython.utils import path\n", "path.locate_profile()\n", "213/2: get_ipython().history_manager.hist_file\n", "213/3: In?\n", "213/4: a = 2\n", "213/5: print(a)\n", "213/6: Out\n", "213/7: a\n", "213/8: Out\n", "213/9: b = Out[9]\n" ] } ], "prompt_number": 26 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Algunos de los comandos usados no son aceptados por un int\u00e9rprete Python cualquiera, como por ejemplo los comandos m\u00e1gicos que empiezan por `%`. Por ello, podemos obtener los comandos ya traducidos a c\u00f3digo Python ejecutable usando la opci\u00f3n `-t` de la historia:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "%hist 1-10 -t" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "from IPython.utils import path\n", "path.locate_profile()\n", "get_ipython().history_manager.hist_file\n", "get_ipython().magic('pinfo In')\n", "a = 2\n", "print(a)\n", "Out\n", "a\n", "Out\n", "b = Out[7]\n", "print(b)\n" ] } ], "prompt_number": 27 }, { "cell_type": "markdown", "metadata": {}, "source": [ "En la tercera l\u00ednea pod\u00e9is ver que en lugar de escribir `%pinfo In` ha escrito `get_ipython().magic('pinfo In')`." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Acceso a la historia de los directorios usados" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`_dh` (tambi\u00e9n podemos usar `%dhist`) nos da informaci\u00f3n de los directorios recorridos. Por ejemplo, voy a recorrer varios directorios y despu\u00e9s veremos la historia de los directorios recorridos:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "cd /home/kiko/pyprojs" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "/home/kiko/pyprojs\n" ] } ], "prompt_number": 28 }, { "cell_type": "code", "collapsed": false, "input": [ "pwd" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 29, "text": [ "'/home/kiko/pyprojs'" ] } ], "prompt_number": 29 }, { "cell_type": "code", "collapsed": false, "input": [ "cd /home/kiko/pyprojs/ipython-master/nb/" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "/home/kiko/pyprojs/ipython-master/nb\n" ] } ], "prompt_number": 30 }, { "cell_type": "code", "collapsed": false, "input": [ "%dhist" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "Directory history (kept in _dh)\n", "0: /home/kiko/pyprojs/ipython-master/nb\n", "1: /home/kiko/pyprojs\n", "2: /home/kiko/pyprojs/ipython-master/nb\n" ] } ], "prompt_number": 31 }, { "cell_type": "code", "collapsed": false, "input": [ "_dh" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 32, "text": [ "['/home/kiko/pyprojs/ipython-master/nb',\n", " '/home/kiko/pyprojs',\n", " '/home/kiko/pyprojs/ipython-master/nb']" ] } ], "prompt_number": 32 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si solo quiero saber el directorio del que part\u00ed en la sesi\u00f3n de IPython en la que me encuentro puedo hacer lo siguiente:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "_dh[0]" ], "language": "python", "metadata": {}, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 33, "text": [ "'/home/kiko/pyprojs/ipython-master/nb'" ] } ], "prompt_number": 33 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Y esto es todo de momento. Pod\u00e9is combinar muchas cosas de las vistas aqu\u00ed con cosas como `%macro`, `%edit`, `%pastebin`,... Si da tiempo, algo muy caro \u00faltimamente, hablaremos sobre algunas cosas que se me ocurren en pr\u00f3ximas entregas.\n", "\n", "Saludos y hasta la pr\u00f3xima entrega." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] } ], "metadata": {} } ] }