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