2012-07-09 18 views
5

He escrito un módulo Python que contiene funciones que devuelven matrices. Quiero poder acceder a las matrices de cadenas devueltas desde el módulo python e iterar en un script bash, así puedo iterar sobre los elementos de la matriz.Pasando la matriz de python al script bash (y pasando la variable bash a la función python)

Por ejemplo:

módulo de Python (mimodelo)

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

def foo1(numargs): 
    return [x for x in range(numargs)] 

script de Bash

foo_array = .... # obtain array from mymod.foo() 
for i in "${foo_array[@]}" 
do 
    echo $i 
done 


foo1_array = .... # obtain array from mymod.foo1(pass arg count from bash) 
for j in "${foo1_array[@]}" 
do 
    echo $j 
done 

¿Cómo puedo aplicar esto en fiesta ?.

versión Info:

Python 2.6.5 bash: 4.1.5

+0

La manera más fácil de entrar y salir de un script es probablemente a través de stdin/stdout. –

Respuesta

13

segundo intento - esta cáscara tiempo lleva la peor de integración.

Dada foo.py que contiene lo siguiente:

def foo(): 
     foo = ('String', 'Tuple', 'From', 'Python') 
     return foo 

luego escriba su escritura del golpe de la siguiente manera:

#!/bin/bash 
FOO=`python -c 'from foo import *; print " ".join(foo())'` 
for x in $FOO: 
do 
     echo "This is foo.sh: $x" 
done 

El resto es la primera respuesta que impulsa la integración desde el extremo del pitón.

Python

import os 
import subprocess 

foo = ('String', 'Tuple', 'From', 'Python') 

os.putenv('FOO', ' '.join(foo)) 

subprocess.call('./foo.sh') 

fiesta

#!/bin/bash 
for x in $FOO 
do 
     echo "This is foo.sh: $x" 
done 
+0

Gracias por los comentarios. Quiero que mi módulo de Python sea independiente de quién/qué lo está llamando (separación de preocupaciones); el código que sugirió requiere la modificación del código python, que no es ideal. –

+0

@HomunculusReticulli OK - espero haberlo entendido ahora mismo - el nuevo código usa shell para impulsar la integración. –

+0

¡SÍ! - Eso intuitivamente tiene sentido !. ¡Muchas gracias!. Acabo de probarlo y funciona :) –

0

En lugar de algo así como la serialización de objetos, quizás una forma de hacerlo es imprimir una lista de valores separados por comas y tubería desde el comando línea.

A continuación, puede hacer algo como:

> python script.py | sh shellscript.sh 
1

Además, se puede decir proceso de Python para leer STDIN con "-" como en

echo "print 'test'" | python - 

Ahora se puede definir multiline snippets de código Python y pasarlos al subnivel

FOO=$(python - <<PYTHON 

def foo(): 
    return ('String', 'Tuple', 'From', 'Python') 

print ' '.join(foo()) 

PYTHON 
) 

for x in $FOO 
do 
    echo "$x" 
done 

también puede utilizar env y configure para listar/pasar variables de entorno y locales de bash a python (en cadenas "..").

+0

Gracias, esto ha sido extremadamente útil para mí. – Perlnika

Cuestiones relacionadas