2012-07-09 20 views
5

Ho scritto un modulo Python che contiene funzioni che restituiscono gli array. Voglio essere in grado di accedere agli array di stringhe restituiti dal modulo python e scorrere su uno script bash, quindi posso eseguire iterazioni sugli elementi dell'array.Passare l'array python allo script bash (e passare la variabile bash alla funzione python)

Ad esempio:

modulo Python (mymod)

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

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

script 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 

Come posso implementare questa in bash ?.

versione Info:

Python 2.6.5 bash: 4.1.5

+0

Il modo più semplice per inserire e uscire da uno script è probabilmente tramite stdin/stdout. –

risposta

13

secondo tentativo - questa conchiglia volta prende il peso di integrazione.

Dato foo.py che contiene questo:

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

quindi scrivere la script bash come segue:

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

il resto viene prima risposta che guida l'integrazione a partire dalla fine di Python.

pitone

import os 
import subprocess 

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

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

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

bash

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

Grazie per il feedback. Voglio che il mio modulo Python sia agnostico su chi/cosa lo chiama (separazione delle preoccupazioni) - il codice che hai suggerito richiede la modifica del codice Python - che non è l'ideale. –

+0

@HomunculusReticulli OK - spero di averlo capito subito - il nuovo codice usa la shell per guidare l'integrazione. –

+0

SÌ! - che intuitivamente ha un senso !. Grazie mille!. Ho appena provato e funziona :) –

0

In luogo di qualcosa come oggetto serializzazione, forse un modo è quello di stampare un elenco di valori separati da virgola e li tubo dal comando linea.

Poi si può fare qualcosa di simile:

> python script.py | sh shellscript.sh 
1

Inoltre, si può dire processo python per leggere i STDIN con "-" come in

echo "print 'test'" | python - 

Ora è possibile definire multiline snippets di codice Python e passali in sottotitoli

FOO=$(python - <<PYTHON 

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

print ' '.join(foo()) 

PYTHON 
) 

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

È inoltre possibile utilizzare env e impostare per elencare/passare l'ambiente e le variabili locali da bash a python (in stringhe "..").

+0

Grazie, questo è stato estremamente utile per me. – Perlnika

Problemi correlati