Comandos de IPython y Shell
Cuando se trabaja de forma interactiva con el intérprete estándar de Python, una de las frustraciones es la necesidad de cambiar entre varias ventanas para acceder a las herramientas de Python y las herramientas de línea de comandos del sistema. IPython cierra esta brecha y le brinda una sintaxis para ejecutar comandos de shell directamente desde la terminal de IPython. La magia ocurre con el signo de exclamación: cualquier cosa que aparezca después de !
en una línea no será ejecutada por el kernel de Python, sino por la línea de comandos del sistema.
Lo siguiente supone que está en un sistema similar a Unix, como Linux o Mac OSX. Algunos de los ejemplos que siguen fallarán en Windows, que usa un tipo diferente de shell de forma predeterminada (aunque con el anuncio de 2016 de los shells nativos de Bash en Windows, es posible que pronto esto deje de ser un problema). Si no está familiarizado con los comandos de shell, le sugiero que revise el Tutorial de Shell elaborado por el siempre excelente Software Carpentry Fundación.
Introducción rápida al Shell¶
Una introducción completa al uso de la línea de comandos/terminal/shell está mucho más allá del alcance de este capítulo, pero para los no iniciados, ofreceremos una introducción rápida aquí. El shell es una forma de interactuar textualmente con su computadora. Desde mediados de la década de 1980, cuando Microsoft y Apple introdujeron las primeras versiones de sus ahora omnipresentes sistemas operativos gráficos, la mayoría de los usuarios de computadoras han interactuado con su sistema operativo a través de un familiar clic en los menús y movimientos de arrastrar y soltar. Pero los sistemas operativos existían mucho antes de estas interfaces gráficas de usuario y se controlaban principalmente a través de secuencias de entrada de texto: en el indicador, el usuario escribía un comando y la computadora hacía lo que el usuario le pedía. Esos primeros sistemas rápidos son los precursores de las carcasas y terminales que la mayoría de los científicos de datos activos todavía utilizan en la actualidad.
Alguien que no esté familiarizado con el shell podría preguntarle por qué se molestaría con esto, cuando se pueden lograr muchos resultados simplemente haciendo clic en los iconos y menús. Un usuario de shell podría responder con otra pregunta: ¿por qué buscar íconos y hacer clic en menús cuando puede lograr cosas mucho más fácilmente escribiendo? Si bien puede parecer un callejón sin salida típico de las preferencias tecnológicas, cuando se va más allá de las tareas básicas, rápidamente queda claro que el caparazón ofrece mucho más control de las tareas avanzadas, aunque es cierto que la curva de aprendizaje puede intimidar al usuario promedio de computadoras.
Como ejemplo, aquí hay una muestra de una sesión de shell de Linux / OSX donde un usuario explora, crea y modifica directorios y archivos en su sistema (osx:~ $
es el indicador, y todo lo que sigue a la $
sign es el comando escrito; el texto que está precedido por un #
es solo una descripción, en lugar de algo que realmente escribirías):
osx:~ $ echo "hello world" # echo is like Python's print function
hello world
osx:~ $ pwd # pwd = print working directory
/home/jake # this is the "path" that we're sitting in
osx:~ $ ls # ls = list working directory contents
notebooks projects
osx:~ $ cd projects/ # cd = change directory
osx:projects $ pwd
/home/jake/projects
osx:projects $ ls
datasci_book mpld3 myproject.txt
osx:projects $ mkdir myproject # mkdir = make new directory
osx:projects $ cd myproject/
osx:myproject $ mv ../myproject.txt ./ # mv = move file. Here we're moving the
# file myproject.txt from one directory
# up (../) to the current directory (./)
osx:myproject $ ls
myproject.txt
Tenga en cuenta que todo esto es solo una forma compacta de realizar operaciones familiares (navegar por una estructura de directorio, crear un directorio, mover un archivo, etc.) escribiendo comandos en lugar de hacer clic en iconos y menús. Tenga en cuenta que con unos pocos comandos (pwd
, ls
, cd
, mkdir
y cp
) puede realizar muchas de las operaciones de archivo más comunes. Es cuando va más allá de estos conceptos básicos cuando el enfoque de shell se vuelve realmente poderoso.
Comandos de Shell en IPython¶
Cualquier comando que funcione en la línea de comandos se puede usar en IPython prefijándolo con el carácter !
. Por ejemplo, los comandos ls
, pwd
y echo
se pueden ejecutar de la siguiente manera:
In [1]: !ls
myproject.txt
In [2]: !pwd
/home/jake/projects/myproject
In [3]: !echo "printing from the shell"
printing from the shell
Pasar valores hacia y desde el Shell¶
Los comandos de shell no solo se pueden llamar desde IPython, sino que también se pueden hacer que interactúen con el espacio de nombres de IPython. Por ejemplo, puede guardar la salida de cualquier comando de shell en una lista de Python usando el operador de asignación:
In [4]: contents = !ls
In [5]: print(contents)
['myproject.txt']
In [6]: directory = !pwd
In [7]: print(directory)
['/Users/jakevdp/notebooks/tmp/myproject']
Tenga en cuenta que estos resultados no se devuelven como listas, sino como un tipo de retorno de shell especial definido en IPython:
In [8]: type(directory)
IPython.utils.text.SList
Esto se parece mucho a una lista de Python, pero tiene una funcionalidad adicional, como los métodos grep
y fields
y el s
, n
y p
propiedades que le permiten buscar, filtrar y mostrar los resultados de manera conveniente. Para obtener más información sobre estos, puede utilizar las funciones de ayuda integradas de IPython.
La comunicación en la otra dirección, pasando las variables de Python al shell, es posible usando la sintaxis {varname}
:
In [9]: message = "hello from Python"
In [10]: !echo {message}
hello from Python
Las llaves contienen el nombre de la variable, que se reemplaza por el contenido de la variable en el comando de shell.
Comandos mágicos relacionados con el shell¶
Si juegas con los comandos de shell de IPython durante un tiempo, es posible que notes que no puedes usar !Cd
para navegar por el sistema de archivos:
In [11]: !pwd
/home/jake/projects/myproject
In [12]: !cd ..
In [13]: !pwd
/home/jake/projects/myproject
La razón es que los comandos del shell en el cuaderno se ejecutan en un subshell temporal. Si desea cambiar el directorio de trabajo de una manera más duradera, puede usar el comando mágico %cd
:
In [14]: %cd ..
/home/jake/projects
De hecho, de forma predeterminada, incluso puede usar esto sin el signo %
:
In [15]: cd myproject
/home/jake/projects/myproject
Esto se conoce como función automagic
, y este comportamiento se puede alternar con la función mágica %automagic
.
Además de %cd
, otras funciones mágicas similares a shell disponibles son %cat
, %cp
, %env
, %ls
, %man
, %mkdir
, %more
, %mv
, < code>%pwd, %rm
y %rmdir
, cualquiera de los cuales se puede utilizar sin el signo %
si automagic
está activado. Esto hace que casi puedas tratar el indicador de IPython como si fuera un shell normal:
In [16]: mkdir tmp
In [17]: ls
myproject.txt tmp/
In [18]: cp myproject.txt tmp/
In [19]: ls tmp
myproject.txt
In [20]: rm -r tmp
Este acceso al shell desde la misma ventana de terminal que su sesión de Python significa que hay muchos menos cambios entre intérprete y shell a medida que escribe su código Python.