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é.
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.
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)
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'>
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"]
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.
et os.environ["DEBUSSY"] = '1'
? Les variables d'environnement sont toujours des chaînes.
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
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()