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