2011-07-16 8 views
11

Quelle est la meilleure façon de passer des variables bash à un script python. Je voudrais faire quelque chose comme ce qui suit:Passer des variables bash à un script?

$cat test.sh 
#!/bin/bash 

foo="hi" 
python -c 'import test; test.printfoo($foo)' 

$cat test.py 
#!/bin/python 

def printfoo(str): 
    print str 

Lorsque je tente d'exécuter le script bash, je reçois une erreur de syntaxe:

File "<string>", line 1 
    import test; test.printfoo($foo) 
          ^
SyntaxError: invalid syntax 

Répondre

8

En bref, cela fonctionne:

... 
python -c "import test; test.printfoo('$foo')" 
... 

Mise à jour:

Si vous pensez que la chaîne peut contenir guillemets simples (') comme dit par @Gordon dans le commentaire ci-dessous, vous pouvez échapper assez facilement ces guillemets simples dans bash. Voici une solution de rechange dans ce cas:

... 
python -c "import test; test.printfoo('"${foo//\'/\\\'}"');" 
... 
+2

Cela échouera de façon intéressante si $ foo contient des guillemets simples ou d'autres caractères que python interprète à l'intérieur des littéraux. @ La solution d'Adam est plus robuste ... –

2

Vous devez utiliser des guillemets doubles pour obtenir la substitution variable frapper. Similaire à PHP.

$ foo=bar 
$ echo $foo 
bar 
$ echo "$foo" 
bar 
$ echo '$foo' 
$foo 

Ainsi, cela devrait fonctionner:

python -c "import test; test.printfoo($foo)" 
+0

qui obtient plus loin, mais maintenant il y a une erreur sur le côté python, où il est dit NameError: nom « salut » est pas défini. – Ravi

2

Est-ce avec la manipulation argv. De cette façon, vous n'avez pas à l'importer, puis exécutez-le à partir de l'interpréteur.

test.py

import sys 

def printfoo(string): 
    print string 

if __name__ in '__main__': 
    printfoo(sys.argv[1]) 

python test.py testingout 
+0

J'espérais appeler directement printfoo car j'ai beaucoup d'autres fonctions python qui prennent des arguments, qui doivent être appelés depuis bash. Si je passe par le principal pour tous, ce serait plus complexe. – Ravi

12

Vous pouvez utiliser os.getenv pour accéder à des variables d'environnement de Python:

import os 
import test 
test.printfoo(os.getenv('foo')) 

Cependant, pour que les variables d'environnement à passer de Bash à tous les processus qu'il crée, vous devez les exporter avec le export builtin:

foo="hi" 
export foo 
# Alternatively, the above can be done in one line like this: 
# export foo="hi" 

python <<EOF 
import os 
import test 
test.printfoo(os.getenv('foo')) 
EOF 

Comme alternative à l'utilisation de variables d'environnement, vous pouvez simplement passer des paramètres directement sur la ligne de commande. Toutes les options passées à Python après la -c command se charger dans le tableau sys.argv:

# Pass two arguments 'foo' and 'bar' to Python 
python - foo bar <<EOF 
import sys 
# argv[0] is the name of the program, so ignore it 
print 'Arguments:', ' '.join(sys.argv[1:]) 
# Output is: 
# Arguments: foo bar 
EOF 
Questions connexes