tutorial tablas notebook insertar imagenes imagen hacer español escribir como ipython-notebook ipython-magic

ipython-notebook - tablas - jupyter python español



¿Puedo acceder a las variables de Python dentro de una celda de cuaderno ipython `%% bash` o` %% script`? (5)

No, %%script magic se genera automáticamente y no realiza ninguna comunicación mágica de datos entre procesos. (que no es el caso para %%R pero que es una magia separada en su propia clase con especial cuidado de los pueblos R )

Pero escribir tu propia magia que lo hace no es demasiado difícil de hacer.

¿Hay alguna forma de acceder a las variables en el kernel de Python actual desde una celda de %%script %%bash u otra %%script ?

¿Tal vez como argumentos de línea de comando o variables de entorno?


Para incluir variables de python en los comandos de bash ejecutados con la sintaxis !<some command> puede usar {<variable>} siguiente manera:

In [1]: for i in range(3): ...: !echo {i+1} ...: 1 2 3

Si bien esto es ligeramente diferente de lo que pidió el OP, está estrechamente relacionado y es útil para realizar una tarea de creación de scripts. Esta publicación tiene más consejos y ejemplos excelentes sobre el uso del comando de shell en las libretas IPython y Jupyter.


Se puede acceder a las variables de Python en la primera línea de una celda de %%script %%bash o %%script , y así se pueden pasar como parámetros de línea de comandos a la secuencia de comandos. Por ejemplo, con bash puedes hacer esto:

%%bash -s "$myPythonVar" "$myOtherVar" echo "This bash script knows about $1 and $2"

La opción de línea de comando -s permite pasar los parámetros posicionales a bash, accediendo a través de $n para el n-ésimo parámetro posicional. Tenga en cuenta que lo que en realidad está asignado a la variable de posición bash es el resultado de str(myPythonVariable) . Si está pasando cadenas que contienen caracteres de comillas (u otros caracteres sensibles al bash), deberá escapar de ellos con una barra invertida (por ejemplo: /" ).

Las citas son importantes: sin ellas, las variables de Python (representaciones de cadena) se dividen en espacios, por lo que si myPythonVar era datetime.datetime con str(myPythonVar) como "2013-10-30 05:04:09.797507" , el guión de bash anterior recibiría 3 variables posicionales, las dos primeras con valores 2013-10-30 y 05:04:09.797507 . Su salida sería:

This bash script knows about 2013-10-30 and 05:04:09.797507

Si desea nombrar las variables y está ejecutando Linux, aquí tiene un enfoque:

%%script env my_bash_variable="$myPythonVariable" bash echo myPythonVariable/'s value is $my_bash_variable

Puede especificar múltiples asignaciones de variables. Nuevamente, tenga cuidado con las citas y otras cosas similares (¡aquí bash se quejará amargamente!). Para comprender por qué funciona esto, consulte la página de manual de env .


Solo para observar una variación, si necesita pasar algo diferente a una variable simple al script de bash:

%%bash -s $dict[''key1''] $dict[''key2''] $dict[''key3'']

va terriblemente mal, pero

%%bash -s {dict[''key1'']} {dict[''key2'']} {dict[''key3'']}

funciona muy bien


Un problema es que si la variable que desea darle a su bash es una lista, no funciona como se esperaba.

Por ejemplo, en una celda de python:

l = [''A'', ''B'', ''C'']

entonces si le das directamente a la opción mágica la siguiente celda:

%%bash -s "$l" for i in $1 do echo $i done

Será extrañamente dividido de esta manera:

[''A'', ''B'', ''C'']

La respuesta más simple es poner el código entre llaves {} para transformar tu lista de python en una lista de bash, como la siguiente:

%%bash -s "{" ".join(l)}" for i in $1 do echo $i done

Que dan la salida esperada:

A B C