Hay una manera de acceder a las variables en el actual núcleo de python desde dentro de un %%bash u otros %%script celular?

Tal vez como argumentos de línea de comandos o la variable de entorno(s)?

InformationsquelleAutor drevicko | 2013-10-25

5 Comentarios

  1. 61

    Python variables pueden ser accedidas en la primera línea de un %%bash o %%script de la célula, y así se pueden pasar como parámetros de línea de comandos de la secuencia de comandos. Por ejemplo, con bash usted puede hacer esto:

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

    La -s opción de línea de comandos le permite pasar parámetros posicionales para bash, se accede a través de $n para el n-ésimo parámetro de posición. Tenga en cuenta que lo que en realidad está asignado a la fiesta de posición variable es el resultado de str(myPythonVariable). Si vas a pasar las cadenas que contienen caracteres de comillas (u otros bash sensibles a los personajes), tendrás que escapar de ellos con una barra diagonal inversa (por ejemplo: \").

    Las comillas son importantes, sin ellos el de python variables (representaciones de cadena) se dividen en los espacios, así que si myPythonVar fue un datetime.datetime con str(myPythonVar) como "2013-10-30 05:04:09.797507", el anterior script de bash que recibiría 3 posicional de las variables, las dos primeras con valores 2013-10-30 y 05:04:09.797507. La salida sería:

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

    Si quieres el nombre de las variables y está corriendo linux, he aquí un enfoque:

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

    Puede especificar múltiples asignaciones de variables. De nuevo, ten cuidado de citas y otras cosas (aquí bash se quejan amargamente!). Para asimilar por qué esto funciona, consulte la env hombre de la página.

  2. 36

    Incluir python variables en bash se ejecutan los comandos utilizando la sintaxis !<some command> puede utilizar {<variable>} de la siguiente manera:

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

    Mientras que esto es un poco diferente de lo que el OP se le pide, está estrechamente relacionado y útil en la realización de una tarea de secuencias de comandos. Este post tiene más consejos y ejemplos de uso de comandos de shell dentro de IPython y Jupyter cuadernos.

    • El enlace está roto. En caché en el WIA: web.archive.org/web/20160914042017/safaribooksonline.com/blog/…
    • Gracias @awalllllll, que acaba de reemplazar el enlace.
    • Esto es genial, gracias. Parece bastante chapucero, pero creo que es todo el propósito de la jupyter cuadernos.
    • nunca hubiera imaginado que sólo puede utilizar ! por lo queramos o no. Usted puede incluso hacer n = !echo {i + 1}.
  3. 3

    Un problema es, si la variable que se quiere dar a la bash es una lista, no funciona como se esperaba.

    Por ejemplo, en uno de python celular:

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

    entonces si le das directamente a la magia de la opción de la siguiente celda:

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

    Va a ser extrañamente dividir así:

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

    La respuesta más sencilla es colocar el código dentro de llaves {} para transformar tu lista de python en bash lista, como los siguientes:

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

    Que dan el resultado esperado:

    A
    B
    C
    
    • extraño que el uso de comillas dentro de comillas dobles obras (: Parece que el %%bash magia está buscando un } y no se preocupa.
  4. 2

    Sólo para señalar una variación, si usted necesita para pasar algo más que un simple variable en el script de bash:

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

    va gruesomely mal, pero

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

    funciona bien.

  5. 0

    No, %%script magia se generan automáticamente y no hacer ninguna magia inter-proceso de comunicación de datos. (que no es el caso de %%R pero que es independiente de la magia en su propia clase con un cuidado extra de R pueblos)

    Pero la escritura de su propia magia que hace no es demasiado difícil de hacer.

    • ¿Te refieres a algo como %%bash -c 'myvar=$MyPythonVar bash', entonces tal vez echo $myvar en la línea siguiente de la célula? Que funciona…
    • Hum, no, eso no era lo que yo miento, pero bueno si funciona.
    • así que.. ¿qué tiene usted en mente? Se queja si el %%bash .. celular no tiene otro contenido, y si puedo poner, decir, ls allí, el sistema operativo viene de vuelta con /bin/echo: /bin/echo: cannot execute binary file (al menos en mi mac pero ubuntu hace algo similar, creo)
    • Ah lo siento, he leído muy rápido, pensé que lo que estaba escribiendo estaba trabajando. Mirando el código de la fiesta de la magia no admite {..} sintaxis, excepto en la primera línea. Por lo que yo se necesitan para escribir por sí mismo.
    • ok. He encontrado un par de maneras de utilizar la primera línea (la respuesta más abajo). Supongo que la escritura de un %% magia para hacerlo mejor que podría ser mejor – quizás comentarios especiales como #%%exppose myPythonVar, a continuación, sustituir su valor en la secuencia de comandos cuando vea $myPythonVar o algo… tal vez un día me voy a dar una vuelta (:
    • En la actual jupyter, el método que he propuesto más arriba no parece estar funcionando – python variables no son accesibles desde la primera línea de un %%bash celular. @Matt se Puede confirmar?
    • Sí puedo confirmar, voy a quitar mi respuesta.
    • Mi error – la variable contiene una cadena vacía, así que no suba. La solución en mi respuesta anterior todavía funciona (:

Dejar respuesta

Please enter your comment!
Please enter your name here