Cómo devolver múltiples variables desde python a bash

Tengo un script de bash que llama a un script de python. Al principio solo estaba devolviendo una variable y eso está bien, pero ahora me dijeron que devolviera dos variables y me preguntaba si hay una forma limpia y simple de devolver más de una variable.

archiveID=$(python glacier_upload.py $archive_file_name $CURRENTVAULT) 

Es la llamada que hago desde bash

 print archive_id['ArchiveId'] archive_id['ArchiveId'] 

Esto devuelve el ID de archivo al script bash

Normalmente, sé que puedes usar una statement de retorno en python para devolver múltiples variables, pero con solo ser un script que es la forma que encontré para devolver una variable. Podría convertirla en una función a la que se llame, pero incluso así, ¿cómo recibiría las múltiples variables que devolvería?

Desde su script de Python, genere una variable por línea. Luego, desde tu script de bash, lee una variable por línea:

Pitón

 print "foo bar" print 5 

Golpetazo

 #! /bin/bash python main.py | while read line ; do echo $line done 

Solución final:

Gracias Guillaume! Me diste un gran punto de partida de la alma. Solo voy a publicar mi solución aquí para otros.

 #! /bin/bash array=() while read line ; do array+=($line) done < <(python main.py) echo ${array[@]} 

Encontré el rest de la solución que necesitaba aquí.

Mi forma favorita es leer directamente en una lista:

 x=($(python3 -c "print('a','b','c')")) echo ${x[1]} b echo ${x[*]} abc 

Por esta razón, si my_python_function devuelve una tupla, usaría el formato para asegurarme de que solo obtengo resultados delimitados por el espacio:

 #Assuming a tuple of length 3 is returned #Remember to quote in case of a space in a single parameter! print('"{}" "{}" "{}"'.format(*my_python_function()) 

Si quieres que esto sea genérico, necesitarás construir la cadena de formato:

 res = my_python_function() print(("{} "*len(res)).format(*res)) 

es una manera No tiene que preocuparse por el espacio adicional, pero podría [: -1] en la cadena de formato para deshacerse de él.

Finalmente, si espera argumentos de varias palabras (es decir, un espacio en un solo argumento, debe agregar comillas y un nivel de direccionamiento indirecto (supongo que solo estará ejecutando sus propios scripts “seguros”):

 #myfile.py res = my_python_function() print(('"{}" '*len(res)).format(*res)) #my file.bash eval x=($(python3 myfile.py))