Comment définir les variables d'environnement en Python

j'ai besoin de définir quelques variables d'environnement dans le script python et je veux tous les autres scripts qui sont appelés à partir de python (scripts shell) qui seront des processus enfants pour voir 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 string. Je veux aussi savoir comment lire les variables d'environnement en python (dans la dernière partie du script) une fois que je l'ai paramétré.

379
demandé sur Salvador Dali 2011-05-12 02:25:11

8 réponses

les variables D'environnement doivent être des chaînes, donc utilisez

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

pour définir la variable DEBUSSY à la chaîne 1 . Pour accéder à cette variable plus tard, il suffit d'utiliser

print os.environ["DEBUSSY"]

les processus enfants héritent automatiquement de l'environnement du processus parent -- aucune action spéciale de votre part n'est requise.

476
répondu Sven Marnach 2011-05-11 22:27:16

Vous pourriez avoir besoin de considérer d'autres aspects du code de la robustesse;

lorsque vous stockez une variable à valeur entière comme variable d'environnement, essayez

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

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

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

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

ainsi, pour mettre que tous 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)
88
répondu Mark 2011-05-12 12:29:26

os.environ se comporte comme un dictionnaire de 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 aussi simplement vérifier si une clé existe:

>>> 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'

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'avais rencontré un problème récemment et compris, si vous avez d'Autres scripts mettant à jour l'environnement pendant que votre script python est en cours d'exécution, appeler os.environ à nouveau ne reflétera pas les dernières valeurs .

extrait du docs :

ce mapping est capturé la première fois que le module os est importé, typiquement pendant le démarrage de Python dans le cadre du traitement site.py. Changements à l'environnement fait après cela le temps ne se reflète pas dans OS.environ, à l'exception des modifications apportées par la modification de l'os.environ directement.

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

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
22
répondu sisanared 2018-08-01 06:15:37

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

Puis faites

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

je veux aussi savoir comment lire le variables d'environnement en python (dans le plus tard, une partie du script) une fois que j'ai mis il.

utiliser simplement os.environ["DEBUSSY"] , comme dans

some_value = os.environ["DEBUSSY"]
17
répondu Jim Brissom 2011-05-11 22:28:30

vous devez assigner une valeur de chaîne de caractères à la variable d'environnement.

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

Si vous voulez lire ou imprimer la variable d'environnement suffit d'utiliser

print os.environ["DEBUSSY"]

cette modification ne sera effective que pour le processus actuel où elle a été assignée, elle ne changera pas la valeur de façon permanente. Le processus fils hérite automatiquement de l'environnement du processus parent.

enter image description here

16
répondu RejeeshChandran 2016-10-06 09:58:27

et os.environ["DEBUSSY"] = '1' ? Les variables d'environnement sont toujours des chaînes.

13
répondu ThiefMaster 2011-05-11 22:27:31

vous pouvez utiliser le dictionnaire os.environ pour accéder à vos variables d'environnement.

maintenant, un problème que j'ai eu est que si j'ai essayé d'utiliser os.system pour exécuter un fichier batch qui définit vos variables d'environnement (en utilisant la commande SET dans un **.bat * file) ne les définirait pas vraiment pour votre environnement python (sauf pour le processus enfant qui est créé avec la fonction os.system ). Pour obtenir 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
8
répondu Ricardo Alejos 2017-05-12 16:20:33

lorsque vous jouez avec des variables d'environnement (add/modify/remove variables), une bonne pratique est de restaurer l'état précédent à la fin de la fonction.

vous pourriez avoir besoin de quelque chose comme le modified_environ gestionnaire de contexte décrire dans ce question pour restaurer les variables d'environnement.

usage classique:

with modified_environ(DEBUSSY="1"):
    call_my_function()
5
répondu Laurent LAPORTE 2017-05-23 12:34:54