J'utilise un script bash (test.sh) et il se charge dans des variables d'environnement (à partir d'env.sh). Cela fonctionne bien, mais j'essaie de voir python peut simplement charger dans les variables déjà dans le script bash.
Oui, je sais qu'il serait probablement plus facile de simplement passer les variables spécifiques dont j'ai besoin comme arguments, mais j'étais curieux de savoir s'il était possible d'obtenir les variables bash.
test.sh
#!/bin/bash
source env.sh
echo $test1
python pythontest.py
env.sh
#!/bin/bash
test1="hello"
pythontest.py
?
print test1 (that is what I want)
Vous devez exporter les variables dans bash, ou elles seront locales à bash:
export test1
Ensuite, en python
import os
print os.environ["test1"]
En supposant que les variables d'environnement qui sont définies sont permanentes, ce que je pense qu'elles ne le sont pas. Vous pouvez utiliser os.environ
.
os.environ["something"]
J'ai créé une petite bibliothèque qui fait ça:
Il existe une autre façon d'utiliser subprocess
qui ne dépend pas de la configuration de l'environnement. Mais avec un peu plus de code.
Pour un script Shell qui ressemble à ceci:
#!/bin/sh
myvar="here is my variable in the Shell script"
function print_myvar() {
echo $myvar
}
Vous pouvez récupérer la valeur de la variable ou même appeler une fonction dans le script Shell comme dans le code Python:
import subprocess
def get_var(varname):
CMD = 'echo $(source myscript.sh; echo $%s)' % varname
p = subprocess.Popen(CMD, stdout=subprocess.PIPE, Shell=True, executable='/bin/bash')
return p.stdout.readlines()[0].strip()
def call_func(funcname):
CMD = 'echo $(source myscript.sh; echo $(%s))' % funcname
p = subprocess.Popen(CMD, stdout=subprocess.PIPE, Shell=True, executable='/bin/bash')
return p.stdout.readlines()[0].strip()
print get_var('myvar')
print call_func('print_myvar')
Notez que les deux Shell=True
doit être défini pour traiter la commande Shell dans CMD
à traiter telle quelle, et définir executable='bin/bash'
pour utiliser la substitution de processus, qui n'est pas prise en charge par la valeur par défaut /bin/sh
.