web-dev-qa-db-fra.com

Lire les variables Bash dans un script Python

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)
37
Tall Paul

Vous devez exporter les variables dans bash, ou elles seront locales à bash:

export test1

Ensuite, en python

import os
print os.environ["test1"]
48
AMADANON Inc.

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"]
4
John

J'ai créé une petite bibliothèque qui fait ça:

https://github.com/aneilbaboo/shellvars-py

4
Aneil Mallavarapu

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.

4
Taejoon Byun