So legen Sie Umgebungsvariablen in Python fest

654

Ich muss einige Umgebungsvariablen im Python-Skript festlegen und möchte, dass alle anderen Skripte, die von Python aufgerufen werden, die festgelegten Umgebungsvariablen sehen.

Wenn ich mache

os.environ["DEBUSSY"] = 1`

es beschwert sich zu sagen, dass 1das ein String sein muss.

Ich möchte auch wissen, wie man die Umgebungsvariablen in Python (im späteren Teil des Skripts) liest, sobald ich sie festgelegt habe.

Prahallada
quelle
auch verwandt: youtu.be/ScyxIfOuSXs?t=61
Yannic Hamann
Unabhängig von der Frage: Ich habe diesen var gelesen. Name als The Cat
ahmed

Antworten:

787

Umgebungsvariablen müssen Zeichenfolgen sein, verwenden Sie sie also

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

um die Variable DEBUSSYauf den String zu setzen 1.

Um später auf diese Variable zuzugreifen, verwenden Sie einfach:

print(os.environ["DEBUSSY"])

Untergeordnete Prozesse erben automatisch die Umgebungsvariablen des übergeordneten Prozesses. Es ist keine spezielle Aktion von Ihrer Seite erforderlich.

Sven Marnach
quelle
20
Auf einigen Plattformen wird durch Ändern von os.environ die Systemumgebung weder für den aktuellen Prozess noch für untergeordnete Prozesse geändert. Weitere Informationen finden Sie in den Dokumenten: docs.python.org/2/library/os.html#os.environ
Evan
8
@Evan Es gibt möglicherweise einige historische Varianten von Unix, die nicht unterstützt werden putenv(), aber für diese Unixen gibt es sowieso nichts, was Sie tun können. Sogar die alte Version von AIX und HPUX, mit der ich gearbeitet habe, hat dies unterstützt. Wenn jemand tatsächlich einen Computer findet, der ihn heute nicht unterstützt, habe ich ernsthafte Zweifel, dass er Python auf diesem Computer ausführen kann. :)
Sven Marnach
3
Achtung: Um aus der obigen Referenz von @ Evan zu zitieren : Solche Änderungen an der Umgebung wirken sich auf Unterprozesse aus, die mit os.system (), popen () oder fork () und execv () gestartet wurden. Mit anderen Worten, denken Sie daran, dass dieser Ansatz nicht die Art und Weise ändert, wie Ihr Programm ausgeführt wird, sondern nur die Art und Weise, wie die untergeordneten Programme ausgeführt werden. Ihr Programm kann zwar Umgebungsvariablen festlegen und zurücklesen, jedoch nur aus der Umgebung, die es für seine untergeordneten Elemente konfiguriert. Siehe auch: Aktuelle Prozessumgebung ändern . Bisher habe ich keine Möglichkeit für ein Python-Skript gefunden, die übergeordnete Umgebung zu ändern.
CODE-REaD
1
@SvenMarnach ist die Aussage "untergeordneter Prozess erbt automatisch die Umgebung des übergeordneten Prozesses" wahr für Shell wie Bash.
Krishna Oza
@darth_coder Dies gilt für alle Prozesse unter Unix-ähnlichen Betriebssystemen. Ich weiß nichts über das andere Betriebssystem. Beachten Sie, dass Shell-Variablen nur dann in der Umgebung gespeichert werden, wenn Sie sie exportieren.
Sven Marnach
114

Möglicherweise müssen Sie einige weitere Aspekte für die Robustheit des Codes berücksichtigen.

Versuchen Sie es, wenn Sie eine Ganzzahlvariable als Umgebungsvariable speichern

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

Beachten Sie beim Abrufen, dass Sie es versuchen sollten, um Fehler zu vermeiden

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

möglicherweise 'Nicht gesetzt' durch '-1' ersetzen

Also, um das alles zusammenzufügen

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)
Kennzeichen
quelle
3
Können Sie sagen, wie die Variable auf einem Linux-Computer festgelegt werden soll? Ist der Code für alle Plattformen gleich?
Anurag-Sharma
2
Es ist selten sinnvoll, -1 für eine fehlende Ganzzahl zu speichern. Eine bessere Wette wäre myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None- auf diese Weise wäre es Keine, wenn keine Nummer angegeben würde
Benjamin Atkin
1
Wenn Sie mit ganzen Zahlen arbeiten, ist ein -1 sinnvoll. Obwohl ich wahrscheinlich eine Variable / Konstante auf den Wert setzen würde, den ich für nicht gesetzt verwenden würde (z value_not_set = '-1'. B. ). Dann könnten Siedebussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe
67

os.environverhält sich wie ein Python-Wörterbuch, sodass alle gängigen Wörterbuchoperationen ausgeführt werden können. Zusätzlich zu den in den anderen Antworten genannten getund setOperationen können wir auch einfach überprüfen, ob ein Schlüssel vorhanden ist. Die Schlüssel und Werte sollten als Zeichenfolgen gespeichert werden .

Python 3

Für Python 3 verwenden Wörterbücher der in Schlüsselwort statt 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'

Bei der Verwendung ist Folgendes zu beachten os.environ:

Obwohl untergeordnete Prozesse die Umgebung vom übergeordneten Prozess erben, war ich kürzlich auf ein Problem gestoßen und habe herausgefunden, dass beim os.environerneuten Aufrufen nicht die neuesten Werte angezeigt werden, wenn andere Skripts die Umgebung aktualisieren, während Ihr Python-Skript ausgeführt wird .

Auszug aus den Dokumenten :

Diese Zuordnung wird beim ersten Import des OS-Moduls erfasst, normalerweise während des Python-Starts als Teil der Verarbeitung von site.py. Nach dieser Zeit vorgenommene Änderungen an der Umgebung werden in os.environ nicht berücksichtigt, mit Ausnahme von Änderungen, die durch direktes Ändern von os.environ vorgenommen wurden.

os.environ.data Das alle Umgebungsvariablen speichert, ist ein diktiertes Objekt, das alle Umgebungswerte enthält:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
sisanared
quelle
1
Die Umgebungsvariablen eines Prozesses werden beim Erstellen des Prozesses festgelegt. Danach vorgenommene Änderungen wirken sich nicht auf die prozesseigene Kopie der Umgebungsvariablen aus. Dies ist allen Prozessen gemeinsam, nicht nur Python. Außerdem os.environ.datawurde in Python 3.2 in umbenannt os.environ._data, wobei der Unterstrich zeigt, dass Sie ihn nicht direkt lesen sollten. Auf os.environ._datajeden Fall werden die Werte sowieso nicht aktualisiert.
Al Sweigart
Ja, ich verstehe jetzt. Ich wollte meine anfängliche Überraschung mit anderen teilen, die auf der Suche sind. Vielen Dank, dass Sie auf die Aktualisierung des Variablennamens seit 3.2 hingewiesen haben. Die Antwort wird aktualisiert.
Sisanared
21

Wenn ich os.environ ["DEBUSSY"] = 1 mache, beschwert es sich, dass 1 ein String sein muss.

Dann mach

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

Ich möchte auch wissen, wie man die Umgebungsvariablen in Python (im späteren Teil des Skripts) liest, sobald ich sie festgelegt habe.

Benutz einfach os.environ["DEBUSSY"] wie in

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

Variable setzen:

Element Zuweisungsmethode mit Schlüssel:

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

zu bekommen oder zu überprüfen, ob es existiert oder nicht,

Da os.environ eine Instanz ist, können Sie versuchen, Objekte zu verwenden.

Methode 1:

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

wird '1'als Rückgabewert erhalten

Methode 2:

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

Methode 3:

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

Methode 4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
Mohideen bin Mohammed
quelle
16

Sie sollten der Umgebungsvariablen einen Zeichenfolgenwert zuweisen.

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

Wenn Sie die Umgebungsvariable lesen oder drucken möchten, verwenden Sie einfach

print os.environ["DEBUSSY"]

Diese Änderungen werden nur für den aktuellen Prozess wirksam, dem sie zugewiesen wurden. Der Wert wird nicht dauerhaft geändert. Die untergeordneten Prozesse erben automatisch die Umgebung des übergeordneten Prozesses.

Geben Sie hier die Bildbeschreibung ein

RejeeshChandran
quelle
5
"Diese Änderungen werden nur für den aktuellen Prozess wirksam, dem sie zugewiesen wurden. Sie ändern den Wert nicht dauerhaft." Dies beantwortete eine Frage, die ich zum Umfang des Festlegens einer Umgebungsvariablen hatte.
Spitfiredd
1
Wenn ich die Python-Shell verlasse und die zuvor festgelegte Betriebssystemumgebung nicht mehr vorhanden ist.
MeadowMuffins
Wie setze ich eine Umgebungsvariable in Windows? Ich habe es versucht, set [<name>=[<value>]]aber es macht es nur für den aktuell laufenden Prozess. Wenn ich das cmd schließe, existiert es nicht und selbst wenn es geöffnet ist, können andere Programme es nicht sehen.
Filip
15

Was ist mit os.environ["DEBUSSY"] = '1'? Umgebungsvariablen sind immer Zeichenfolgen.

DiebMaster
quelle
14

Ich habe versucht, Umgebungsvariablen hinzuzufügen. Mein Ziel war es, einige Benutzerinformationen in Systemvariablen zu speichern, damit ich diese Variablen für zukünftige Lösungen als Alternative zu Konfigurationsdateien verwenden kann. Die im folgenden Code beschriebene Methode hat mir jedoch überhaupt nicht geholfen.

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")

Dieser einfache Codeblock funktioniert gut. Diese Variablen sind jedoch in den jeweiligen Prozessen vorhanden, sodass Sie sie nicht auf der Registerkarte Umgebungsvariablen der Windows-Systemeinstellungen finden. Ziemlich viel über dem Code hat meinen Zweck nicht erfüllt. Dieses Problem wird hier diskutiert: Problem beim Speichern von Variablen

os.environ.putenv(key, value)

Ein weiterer erfolgloser Versuch. Schließlich gelang es mir, Variablen erfolgreich im Fensterumgebungsregister zu speichern, indem ich die Windows-Shell-Befehle nachahmte, die in der Systemklasse des Betriebssystempakets enthalten waren. Der folgende Code beschreibt diesen erfolgreichen Versuch.

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

Ich hoffe, dass dies für einige von Ihnen hilfreich sein wird.

Sourabh Desai
quelle
12

Es sollte beachtet werden, dass beim Versuch, die Umgebungsvariable auf eine Bash-Auswertung zu setzen, nicht das gespeichert wird, was Sie erwarten. Beispiel:

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

Dadurch wird es nicht wie in einer Shell ausgewertet. Statt /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeals Pfad zu erhalten, erhalten Sie den wörtlichen Ausdruck $(/usr/libexec/java_home).

Stellen Sie sicher, dass Sie es auswerten, bevor Sie die Umgebungsvariable wie folgt festlegen:

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
quelle
11

Sie können das os.environWörterbuch verwenden, um auf Ihre Umgebungsvariablen zuzugreifen.

Ein Problem, das ich hatte, ist, dass wenn ich versuchen würde, os.systemeine Batch-Datei auszuführen, die Ihre Umgebungsvariablen festlegt (mit dem Befehl SET in einer **. Bat * -Datei), diese nicht wirklich für Ihre Python-Umgebung festgelegt würde (aber für der untergeordnete Prozess, der mit der os.systemFunktion erstellt wird). Um die in der Python-Umgebung festgelegten Variablen tatsächlich abzurufen, verwende ich dieses Skript:

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
quelle
9

Wenn Sie mit Umgebungsvariablen spielen (Variablen hinzufügen / ändern / entfernen), empfiehlt es sich, den vorherigen Status nach Abschluss der Funktion wiederherzustellen.

Möglicherweise benötigen Sie etwas, das der modified_environKontextmanager in dieser Frage beschreibt , um die Umgebungsvariablen wiederherzustellen.

Klassische Verwendung:

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