Quiero ejecutar una secuencia de comandos de python desde un script de bash, y quiero almacenar el resultado de la secuencia de comandos de python en una variable.

En mi secuencia de comandos de python, puedo imprimir algunas cosas a la pantalla y al final me devuelva una cadena con:

sys.exit(myString) 

En mi script de bash, hice lo siguiente:

outputString=`python myPythonScript arg1 arg2 arg3 `

Pero luego, cuando volví a comprobar el valor de outputString con echo $outputString puedo obtener todo lo que la secuencia de comandos de Python había impreso a la pantalla, pero no el valor de retorno myString!

¿Cómo debo hacerlo?

EDIT: necesito la cadena ya que me dice donde un archivo creado por el script de Python se encuentra. Quiero hacer algo como:

fileLocation=`python myPythonScript1 arg1 arg2 arg1`
python myPythonScript2 $fileLocation

7 Comentarios

  1. 38

    sys.exit(myString) no significa «retorno de esta cadena». Si pasa una cadena sys.salida, sys.exit tendrá en cuenta que la cadena ser un mensaje de error, y que va a escribir que la cadena stderr. El concepto más cercano a un valor de retorno para un programa entero es su estado de salida, que debe ser un entero.

    Si quieres capturar el resultado por escrito a stderr, puedes hacer algo como

    python yourscript 2> return_file

    Se podría hacer algo como eso en su script de bash

    output=$((your command here) 2> &1)

    Esto no está garantizado sólo para capturar el valor que se pasa a sys.exit, aunque. Otra cosa por escrito a stderr también serán capturados, lo cual podría incluir el registro de salida o seguimientos de pila.

    ejemplo:

    test.py

    print "something"
    exit('ohoh') 

    t.sh

    va=$(python test.py 2>&1)                                                                                                                    
    mkdir $va

    bash t.sh

    editar

    No seguro por qué, pero en ese caso, me gustaría escribir un script principal y otros dos scripts… la Mezcla de python y bash es inútil a menos que usted realmente necesita.

    import script1
    import script2
    
    if __name__ == '__main__':
        filename = script1.run(sys.args)
        script2.run(filename)
    • Todo esto funciona. Pero me gustaría aconsejar a utilizar entero códigos de salida para permitir que el script a jugar bien en la Onu*x ambiente.
    • Uhm. ¿Por qué estás haciendo 2>? lo que 2 para? Todo lo que necesitas hacer es recuperar la ubicación de un archivo que mi secuencia de comandos de python ha creado y escrito y yo no puedo apagar todas las impresiones.
    • > es un operador de redirección. 2> redirigir los mensajes de error, > solo es stdout < es stdin
    • Tal vez usted está buscando en el lugar equivocado. Por favor aclarar tu objetivo en tu pregunta para que podamos asesorarle de la mejor manera para lograr esto.
    • Lo siento. He añadido más información en el post original.
    • La cosa es que desde que está escrito en stderr con sys.exit. No es cierto que nada más va a ser escrito.
    • OK, gracias. Entonces, ¿qué debo hacer para que el comportamiento descrito en mi última edición?
    • ¿por qué no llamar la secuencia de comandos de python en sí? ¿No es una parte de la secuencia de comandos… incluso me atrevería a escribir una secuencia de comandos de python que el uso de secuencias de comandos. Yo no veo el punto de usar BASH si su ir y venir a python.
    • Oh, bueno, es sólo porque no estoy muy familiarizado con las llamadas secuencias de comandos de python desde dentro de una secuencia de comandos de python. No tengo tiempo ahora para remodule todo lo que me puede importar el segundo módulo y las funciones de llamada de ella. Sólo necesito para ejecutar la primera secuencia de comandos y, a continuación, el segundo en el archivo que acaba de crear la primera secuencia de comandos. El problema es que tengo más argumentos para el segundo script, no sólo la posición del archivo. ¿Cómo es trabajar con run?
    • En su última edición, ¿cómo puedo devolver un valor desde el primer script, si sys.exit(someValue) acaba de escribir a stderr no cualquier valor entero?
    • He intentado la primera solución, pero la sintaxis no aceptados: $ output=$((python myScript.py -f someFile -d 1 --counter 30) 2> &1) -bash: command substitution: line 1: syntax error near unexpected token &’ -bash: la sustitución de comandos: línea 1: (python myScript.py -f someFile -d 1 --counter 3) 2> &1'
    • extra entre paréntesis no son necesarios por lo que puedo contar. He añadido un ejemplo
    • run es sólo una función… en otras palabras, que en realidad no se llama a un otro script. Es el uso de funciones o separación de las cosas en módulos. Es una secuencia de comandos de python…
    • dejar el espacio entre 2>y &1 => output=$((your command here) 2>&1)

  2. 20

    sys.exit() debe devolver un entero, no una cadena:

    sys.exit(1)

    El valor 1 es en $?.

    $ cat e.py
    import sys
    sys.exit(1)
    $ python e.py
    $ echo $?
    1

    Edición:

    Si quieres escribir a stderr, uso sys.stderr.

    • Ok, gracias. No veo el punto de $?, sin embargo.
    • $? puede ser utilizado por un shell script para comprobar si el comando anterior funcionaba bien o si había un error. Códigos de salida son una forma básica para los programas de la Onu*x ambiente para comunicarse.
    • $? es el código de retorno. Se utiliza para saber si el script se ha completado correctamente o no. Su cómo funciona, usted podría tener return 0 == ‘bien’, 1=> error, 2=>Algunos de error específico, etc…
    • Tichodroma, en realidad sys.salida permiten string args se imprimirá a stderr.
    • Cierto, pero me gustaría consejos contra el uso de este.
  3. 7

    No utilice sys.exit como este. Cuando se llama con un argumento de cadena, el código de salida de tu proceso será 1, la señalización de una condición de error. La cadena está impreso error estándar para indicar lo que el error podría ser. sys.exit no es para ser utilizado para proporcionar un «valor de retorno» para la secuencia de comandos.

    Lugar, usted debe simplemente imprimir el «valor de retorno» a la salida estándar utilizando un print declaración, a continuación, llamar sys.exit(0), y la captura de la salida en el shell.

  4. 5

    leer en el docs.
    Si usted devuelve nada pero un int o None será impreso en stderr.

    Para obtener stderr mientras descartando stdout hacer:

    output=$(python foo.py 2>&1 >/dev/null)
    • Esto funciona, pero no resuelve el problema equivocado. Por el paso de una cadena a sys.exit, está implícitamente diciendo que su guión ha fallado mediante el uso de un código de salida de 1.
  5. 1

    Documentación de Python para sys.de salida([arg])dice:

    El argumento opcional arg puede ser un número entero dando el estado de salida (por defecto en cero), u otro tipo de objeto. Si es un entero, el cero es considerado como «la terminación exitosa» y cualquier valor distinto de cero se considera «anormal de terminación» por conchas y similares. La mayoría de los sistemas requieren para estar en el rango de 0 a 127, y producir resultados no definidos de otra manera.

    Además, recuperar el valor de retorno del último programa ejecutado podría utilizar el $? bash variable predefinida.

    De todos modos si pones una cadena como arg en sys.exit() debe ser impreso en el final de su programa de salida en una línea por separado, así que usted puede recuperar sólo con un poco de análisis. Como un ejemplo, considere esto:

    outputString=`python myPythonScript arg1 arg2 arg3 | tail -0`
    • Robinson considerar el uso de cola -0. Se debe trabajar como usted indicó en su editada pregunta. No olvides puntuar la respuesta.
    • Su respuesta lista otra la sustitución de comandos de sintaxis.. Que es un alias para la sintaxis de Ricky Robinson ha utilizado en él pregunta. Por favor, preste atención!
    • Gracias, Giovanni. Pero esto es sólo una solución, ¿verdad?
    • La documentación de Python también decir que si una cadena dada como parámetro sys.exit() es tratado como un mensaje de error. Que significa (en linux/unix systems) es enviado a stderr. Si el bash (como la mayoría) había stderr vinculado con el terminal, usted debe ver a su cadena al final de su salida de secuencia de comandos y usted simplemente podría recuperar con la cola. Para obtener el mismo resultado con más elegancia que usted puede utilizar sys.stderr(«su mensaje») y, a continuación, sys.exit(0).
    • Gracias. Tal vez debería clara sys.stderr antes de incluir mi valor, ¿qué te parece? De cualquier manera lo puedo hacer?
    • Robinson no es necesario limpiar sys.stderr antes, porque con la cola usted está buscando la última stdout/stderr línea.
    • sys.exit escribe error estándar, por lo que la tubería de salida estándar a través de tail no ayuda.
    • Si utiliza sys.salir con cadenas, pero no se si usarlo como está previsto en el Python sys.exit() de la documentación (con número entero de 0 a 127). Por favor, lea el doc!

  6. 0

    Además de lo Tichodroma dijo, usted podría terminar usando esta sintaxis:

    outputString=$(python myPythonScript arg1 arg2 arg3)
    • Esto captura la salida estándar, no el error estándar.
  7. 0

    Respondió a su propia pregunta. Si desea ejecutar una secuencia de comandos de Python desde bash y almacenar el resultado en un bash variable, ser selectivo en lo que su secuencia de comandos de Python imprime.

    Hacer un «detallado» de la bandera que se puede desactivar en su secuencia de comandos de Python para suprimir la extra de texto que no desea que se almacenan en su bash variable. No se involucre en la escritura de una salida válida para stderr o reemplazar los códigos de salida! (que es lo que el mal que hacen los niños…)

    Intentar algo como esto:

    fileLocation=`python myPythonScript1 arg1 arg2 arg1 --verbose off`

Dejar respuesta

Please enter your comment!
Please enter your name here