2011-12-19 33 views
11

Estoy tratando de encontrar la manera de llamar a una función de Python desde un script de shell.Llamar a una función de Python desde un script de shell

Tengo un archivo de Python con múltiples funciones y necesito utilizar los valores devueltos por ellos en mi script de shell. Hay una manera de hacerlo.

que estoy haciendo esto con el fin de leer un archivo de configuración usando Python y obtener los valores en la cáscara. ¿Hay alguna otra forma mejor de lograr esto?

test.py contiene:

import ConfigParser 

config = ConfigParser.ConfigParser() 
config.read("test.conf") 

def get_foo(): 
    return config.get("locations", "foo") 

def get_bar(): 
    return config.get("locations", "bar") 

I necesidad de almacenar los valores devueltos por las funciones de Python en una variable shell.

+3

¿Cuál es el problema más grande que usted está tratando de resolver? ¿Por qué no usar el script con la configuración para hacer el trabajo del script de shell? Alternativamente, ¿por qué no leer la configuración desde el shell? Supongo que el problema es lo suficientemente complejo como para dividirlo en dos archivos. –

Respuesta

22

Puede enviar el resultado de sus funciones a la salida estándar preguntando al intérprete de Python para imprimir el resultado:

python -c 'import test; print test.get_foo()' 

La opción -c simplemente le pide Python para ejecutar algunos comandos de Python.

Con el fin de almacenar el resultado en una variable, puede por lo tanto hacer:

RESULT_FOO=`python -c 'import test; print test.get_foo()'` 

o, equivalentemente

RESULT=$(python -c 'import test; print test.get_foo()') 

desde acentos abiertos y $(…) evaluar un sistema y sustituirlo por su salida.

PS: Obtener el resultado de cada función requiere analizar el archivo de configuración cada vez, con este enfoque. Esto puede ser optimizado mediante la devolución de todos los resultados en una sola vez, con algo como:

ALL_RESULTS=$(python -c 'import test; print test.get_foo(), test.get_bar()') 

Los resultados a continuación se pueden dividir y poner en diferentes variables con

RESULT_BAR=$(echo $ALL_RESULTS | cut -d' ' -f2) 

que toma la segundo resultado y lo pone en RESULT_BAR por ejemplo (y de manera similar: -fn para el resultado #n).

PPS: Como se mencionó Pablo Maurin, probablemente sería más fácil hacer todo en un solo intérprete (Python, pero tal vez también la cáscara), si es posible, en lugar de calcular las variables en un programa y usarlos en otro uno.

+0

o intente enviar el resultado a otro script de python y ejecutar eso. – sum2000

+0

se ve bien ... funcionó ... me preguntaba. en este caso ... para leer el parámetro n desde el archivo de configuración necesito llamar n veces la línea anterior del shell que terminará leyendo tantas veces en python usando configparser. ¿Hay alguna otra manera mejor que yo podría hacer? –

+1

@saddy: Se podría, por ejemplo, imprimir dos resultados juntos, y luego usar utilidades Unix partirlos: 'RESULTADO = $ (prueba de importación; test.get_foo de impresión(), test.get_bar())', y luego usar 'cortan ',' sed' (?), o 'awk' (?) para extraer cada parte del resultado por turno: 'RESULT2 = $ (eco $ RESULTADO | corte -d '' -f 2)' da tu 'get_bar()', etc. – EOL

Cuestiones relacionadas