Comment définir des variables d'environnement en Python

658

J'ai besoin de définir certaines variables d'environnement dans le script python et je veux que tous les autres scripts appelés depuis python voient les variables d'environnement définies.

Si je fais

os.environ["DEBUSSY"] = 1`

il se plaint de dire que cela 1doit être une chaîne.

Je veux également savoir comment lire les variables d'environnement en python (dans la dernière partie du script) une fois que je l'ai défini.

prahallada
la source
également lié: youtu.be/ScyxIfOuSXs?t=61
Yannic Hamann
Sans rapport avec la question: j'ai lu que var. nom comme le chat
ahmed

Réponses:

790

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

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

pour définir la variable DEBUSSYsur 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.

Sven Marnach
la source
20
Sur certaines plates-formes, la modification de os.environ ne modifiera pas réellement l'environnement système pour le processus en cours ou les processus enfants. Consultez la documentation pour plus d'informations: docs.python.org/2/library/os.html#os.environ
Evan
8
@Evan Il peut y avoir des variantes historiques d'Unix qui ne prennent pas en charge putenv(), mais pour ces Unixen, il n'y a rien que vous puissiez faire de toute façon. Même les anciennes versions d'AIX et HPUX avec lesquelles je travaillais le supportaient. Si quelqu'un est en mesure de trouver un ordinateur qui ne le prend pas en charge aujourd'hui, j'ai de sérieux doutes qu'il pourra exécuter Python sur cet ordinateur. :)
Sven Marnach
3
Attention: pour citer la référence de @ Evan ci-dessus, ces modifications de l'environnement affectent les sous-processus démarrés avec os.system (), popen () ou fork () et execv (). En d'autres termes, gardez à l'esprit que cette approche ne modifiera pas la façon dont votre programme s'exécute, mais uniquement la façon dont les enfants de votre programme s'exécutent. Certes, votre programme peut définir et relire des variables d'environnement, mais uniquement à partir de l'environnement qu'il configure pour ses enfants. Voir aussi: modifier l'environnement de processus actuel . Jusqu'à présent, je n'ai pas trouvé de moyen pour un script Python de modifier son env parent.
CODE-REaD
1
@SvenMarnach est la déclaration "le processus enfant hérite automatiquement de l'environnement du processus parent" true pour shell comme bash.
Krishna Oza
@darth_coder C'est vrai pour tous les processus sur les systèmes d'exploitation de type Unix. Je ne connais pas l'autre système d'exploitation. Notez que les variables shell ne sont pas stockées dans l'environnement sauf si vous les exportez.
Sven Marnach
114

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

lorsque vous stockez une variable à 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»

donc, pour mettre tout 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)
marque
la source
3
Pouvez-vous dire comment définirait la variable sur une machine Linux, le code est-il le même pour toutes les plates-formes?
Anurag-Sharma
2
Il est rarement judicieux de stocker -1 pour un entier manquant. Un meilleur pari serait myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None- de cette façon, ce serait Aucun si aucun numéro n'était fourni
Benjamin Atkin
1
Si vous avez affaire à des entiers, un -1 est logique. Bien que je définirais probablement une variable / constante à la valeur que j'utiliserais pour ne pas définir (par exemple, value_not_set = '-1'). Ensuite, vous pouvez utiliserdebussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe
68

os.environse comporte comme un dictionnaire python, de sorte que toutes les opérations courantes du dictionnaire peuvent être effectuées. En plus des opérations getet setmentionnées dans les autres réponses, nous pouvons également simplement vérifier si une clé existe. Les clés et les valeurs doivent être stockées sous forme de chaînes .

Python 3

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

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

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'

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

Bien que les processus enfants héritent de l'environnement du processus parent, j'ai rencontré récemment un problème et j'ai compris que si vous avez d'autres scripts mettant à jour l'environnement pendant que votre script python est en cours d'exécution, appeler à os.environnouveau ne reflétera pas les dernières valeurs .

Extrait des documents :

Ce mappage est capturé la première fois que le module os est importé, 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, qui contient toutes les valeurs d'environnement:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
sisanared
la source
1
Les variables d'environnement d'un processus sont définies lors de la création du processus. Toute modification apportée après cela n'affectera pas la copie du processus de la variable d'environnement. Ceci est commun à tous les processus, pas seulement à Python. De plus, a os.environ.dataété renommé en Python 3.2 en os.environ._data, le préfixe de soulignement indiquant que vous ne devriez pas le lire directement. Quoi qu'il en soit, os.environ._datales valeurs ne seront pas mises à jour de toute façon.
Al Sweigart
Oui, je comprends maintenant. Je voulais partager ma première surprise avec ceux qui viennent chercher. Merci d'avoir signalé la mise à jour du nom de variable depuis la 3.2, mettra à jour la réponse.
sisanared
21

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

Alors fais

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

Je veux également savoir comment lire les variables d'environnement en python (dans la dernière partie du script) une fois que je l'ai défini.

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

some_value = os.environ["DEBUSSY"]
Jim Brissom
la source
19

définir la variable:

Méthode d'affectation des éléments à l'aide de la clé:

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

pour obtenir ou vérifier son existence ou non,

puisque os.environ est une instance, 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
Mohideen bin Mohammed
la source
16

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

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

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

print os.environ["DEBUSSY"]

Ces modifications ne seront effectives que pour le processus en cours où elles ont été affectées, elles ne modifieront pas la valeur de façon permanente. Les processus enfants hériteront automatiquement de l'environnement du processus parent.

entrez la description de l'image ici

RejeeshChandran
la source
5
«Ces modifications ne seront effectives que pour le processus en cours où elles ont été affectées, elles ne changeront pas la valeur de manière permanente.» Cela a répondu à une question que j'avais sur la portée de la définition d'une variable d'environnement.
spitfiredd
2
Si je quitte le shell python et que l'ensemble d'environnement os est parti précédemment.
MeadowMuffins
Comment définir une variable d'environnement dans Windows? J'ai essayé set [<name>=[<value>]]mais cela ne fait que pour le processus en cours d'exécution. Quand je ferme la cmd, elle n'existe pas et même lorsqu'elle est ouverte, d'autres programmes ne peuvent pas la voir.
Filip
15

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

ThiefMaster
la source
14

J'ai essayé d'ajouter des variables d'environnement. Mon objectif était de stocker des informations utilisateur sur des variables système afin que je puisse utiliser ces variables pour de futures solutions, comme alternative aux fichiers de configuration. Cependant, la méthode décrite dans le code ci-dessous ne m'a pas du tout aidé.

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

Ce simple bloc de code fonctionne bien, cependant, ces variables existent dans les processus respectifs de sorte que vous ne les trouverez pas dans l'onglet Variables d'environnement des paramètres système de Windows. À peu près le code ci-dessus n'a pas servi mon objectif. Ce problème est discuté ici: problème de sauvegarde des variables

os.environ.putenv(key, value)

Une autre tentative infructueuse. Donc, finalement, j'ai réussi à enregistrer la variable avec succès dans le registre d'environnement de fenêtre en imitant les commandes shell Windows enveloppées dans la classe système du package os. Le code suivant décrit cette tentative réussie.

os.system("SETX {0} {1} /M".format(key, value))

J'espère que cela sera utile pour certains d'entre vous.

Sourabh Desai
la source
12

Il convient de noter que si vous essayez de définir la variable d'environnement sur une évaluation bash, elle 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, donc au lieu de devenir /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeun 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(f"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(f"Error: Unable to find environment variable {bash_variable}")
Josh Correia
la source
11

Vous pouvez utiliser le os.environdictionnaire pour accéder à vos variables d'environnement.

Maintenant, un problème que j'ai eu est que si j'essayais d'utiliser os.systempour exécuter un fichier batch qui définit vos variables d'environnement (en utilisant la commande SET dans un fichier **. Bat *), il ne les définirait pas vraiment pour votre environnement python (mais pour le processus enfant créé avec la os.systemfonction). Pour obtenir réellement 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
Ricardo Alejos
la source
9

Lorsque vous jouez avec des variables d'environnement (ajouter / modifier / supprimer des variables), une bonne pratique consiste à restaurer l'état précédent à la fin de la fonction.

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

Utilisation classique:

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