web-dev-qa-db-fra.com

Comment définir des variables d'environnement dans Python

J'ai besoin de définir des variables d'environnement dans le script python et je souhaite que tous les autres scripts appelés à partir de python (scripts Shell), qui seront des processus enfants, permettent d'afficher les variables d'environnement définies. . La valeur est un nombre.

Si je fais os.environ["DEBUSSY"] = 1, il se plaint en disant que 1 doit être une chaîne. Je veux aussi savoir comment lire les variables d'environnement dans python (dans la partie ultérieure du script) une fois que je l'ai défini.

521
prahallada

Les variables d'environnement doivent être des chaînes, utilisez donc

os.environ["DEBUSSY"] = "1"

définir la variable DEBUSSY sur la chaîne 1.

Pour accéder à cette variable ultérieurement, utilisez simplement:

print(os.environ["DEBUSSY"])

Les processus enfants héritent automatiquement des variables d'environnement du processus parent - aucune action spéciale de votre part n'est requise.

635
Sven Marnach

Vous devrez peut-être prendre en compte d'autres aspects pour la robustesse du code;

lorsque vous stockez une variable de valeur entière en tant que variable d'environnement, essayez

os.environ['DEBUSSY'] = str(myintvariable)

puis pour la récupération, considérez que pour éviter les erreurs, vous devriez essayer

os.environ.get('DEBUSSY', 'Not Set')

éventuellement remplacer "-1" par "non défini"

alors, pour mettre cela ensemble

myintvariable = 1
os.environ['DEBUSSY'] = str(myintvariable)
strauss = int(os.environ.get('STRAUSS', '-1'))
# NB KeyError <=> strauss = os.environ['STRAUSS']
debussy = int(os.environ.get('DEBUSSY', '-1'))

print "%s %u, %s %u" % ('Strauss', strauss, 'Debussy', debussy)
101
Mark

os.environ se comporte comme un dictionnaire python, de sorte que toutes les opérations courantes du dictionnaire peuvent être effectuées. En plus des opérations get et set mentionnées dans les autres réponses, nous pouvons également simplement vérifier si une clé existe

Python 2

>>> import os
>>> os.environ.has_key('HOME')  # Check an existing env. variable
True
>>> os.environ.has_key('FOO')   # Check for a non existing variable
False
>>> os.environ['FOO'] = '1'     # Set a new env. variable (String value)
>>> os.environ.has_key('FOO')
True
>>> os.environ.get('FOO')       # Retrieve the value
'1'

Python 3

Pour python 3, les dictionnaires utilisent le mot clé dans au lieu de has_key

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

Il y a une chose importante à noter à propos de l'utilisation de os.environ:

Bien que les processus enfants héritent de l’environnement du processus parent, j’ai rencontré récemment un problème qui a été résolu. Si d’autres scripts mettent à jour l’environnement pendant que votre script python est en cours d’exécution, appelez à nouveau os.environ. ne reflétera pas les dernières valeurs .

Extrait du docs :

Ce mappage est capturé lors de la première importation du module os, généralement lors du démarrage de Python dans le cadre du traitement site.py. Les modifications apportées à l'environnement après cette heure ne sont pas reflétées dans os.environ, à l'exception des modifications apportées en modifiant directement os.environ.

os.environ.data qui stocke toutes les variables d'environnement, est un objet dict contenant toutes les valeurs d'environnement:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
45
sisanared

si je fais os.environ ["DEBUSSY"] = 1, il se plaint en disant que 1 doit être une chaîne.

Alors fais

os.environ["DEBUSSY"] = "1"

Je veux aussi savoir comment lire les variables d’environnement en python (plus tard dans le script) une fois que je l’ai défini.

Il suffit d'utiliser os.environ["DEBUSSY"], comme dans

some_value = os.environ["DEBUSSY"]
18
Jim Brissom

Vous devez affecter une valeur de chaîne à la variable d'environnement.

os.environ["DEBUSSY"] = "1"

Si vous voulez lire ou imprimer la variable d'environnement, utilisez simplement

print os.environ["DEBUSSY"]

Ces modifications n'entreront en vigueur que pour le processus en cours auquel elle a été affectée. Aucune modification permanente de la valeur. Les processus enfants hériteront automatiquement de l'environnement du processus parent.

enter image description here

16
RejeeshChandran

Qu'en est-il de os.environ["DEBUSSY"] = '1'? Les variables d'environnement sont toujours des chaînes.

14
ThiefMaster

définir une variable:

méthode d’affectation des éléments avec la clé:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

obtenir ou vérifier son existence ou non,

puisque os.environ est une instance que vous pouvez essayer de manière objet.

Méthode 1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

obtiendra '1' comme valeur de retour

Méthode 2:

os.environ['DEBUSSY'] # will throw an key error if not found!

Méthode 3:

'DEBUSSY' in os.environ  # will return Boolean True/False

Méthode 4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
12

Vous pouvez utiliser le dictionnaire os.environ pour accéder aux variables d’environnement.

Maintenant, un problème que j’avais, c’est que si j’essayais d’utiliser os.system pour exécuter un fichier de traitement par lots définissant vos variables d’environnement (à l’aide de la commande SET dans un fichier **. Bat *), il ne les définirait pas vraiment pour votre environnement. environnement python (mais pour le processus enfant créé avec la fonction os.system). Pour utiliser les variables définies dans l'environnement python, j'utilise ce script:

import re
import system
import os

def setEnvBat(batFilePath, verbose = False):
    SetEnvPattern = re.compile("set (\w+)(?:=)(.*)$", re.MULTILINE)
    SetEnvFile = open(batFilePath, "r")
    SetEnvText = SetEnvFile.read()
    SetEnvMatchList = re.findall(SetEnvPattern, SetEnvText)

    for SetEnvMatch in SetEnvMatchList:
        VarName=SetEnvMatch[0]
        VarValue=SetEnvMatch[1]
        if verbose:
            print "%s=%s"%(VarName,VarValue)
        os.environ[VarName]=VarValue
10
Ricardo Alejos

Lorsque vous jouez avec des variables d'environnement (ajout/modification/suppression de variables), il est conseillé de restaurer l'état précédent à l'achèvement de la fonction.

Vous aurez peut-être besoin de quelque chose comme le gestionnaire de contexte modified_environ décrit dans cette question pour restaurer les variables d'environnement.

Utilisation classique:

with modified_environ(DEBUSSY="1"):
    call_my_function()
8
Laurent LAPORTE

Notez que si vous essayez de définir la variable d'environnement sur une évaluation bash, celle-ci ne stockera pas ce que vous attendez. Exemple:

from os import environ

environ["Java_HOME"] = "$(/usr/libexec/Java_home)"

Cela ne l'évaluera pas comme dans un Shell. Ainsi, au lieu d'obtenir /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home comme chemin, vous obtiendrez l'expression littérale $(/usr/libexec/Java_home).

Assurez-vous de l'évaluer avant de définir la variable d'environnement, comme suit:

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/Java_home)"
capture = Popen("echo " + bash_variable, stdout=PIPE, Shell=True)
std_out, std_err = capture.communicate()
return_code = capture.returncode

if return_code == 0:
    evaluated_env = std_out.decode().strip()
    environ["Java_HOME"] = evaluated_env
else:
    print("Error: Unable to find environment variable " + bash_variable)
2
Josh Correia