it-swarm.com.de

So legen Sie Umgebungsvariablen in Python fest

Ich muss einige Umgebungsvariablen im Skript python festlegen, und ich möchte, dass alle anderen Skripten, die von python (Shell-Skripten) aufgerufen werden, untergeordnete Prozesse sind, damit die Umgebungsvariablen festgelegt werden . Der Wert ist eine Zahl.

Wenn ich os.environ["DEBUSSY"] = 1 mache, beschwert es sich, dass 1 ein String sein muss. Ich möchte auch wissen, wie die Umgebungsvariablen in python (im späteren Teil des Skripts) gelesen werden, sobald ich sie festgelegt habe.

521
prahallada

Umgebungsvariablen müssen Zeichenfolgen sein, verwenden Sie also

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

um die Variable DEBUSSY auf den String 1 zu setzen.

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

print(os.environ["DEBUSSY"])

Untergeordnete Prozesse erben automatisch die Umgebungsvariablen des übergeordneten Prozesses. Es sind keine besonderen Maßnahmen Ihrerseits erforderlich.

635
Sven Marnach

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

versuchen Sie es, wenn Sie eine ganzzahlige Variable als Umgebungsvariable speichern

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

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

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

möglicherweise '-1' für 'Nicht gesetzt' ersetzen

also, um das alles zusammen zu fassen

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)
101
Mark

os.environ verhä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 erwähnten Vorgängen get und set können wir auch einfach prüfen, ob ein Schlüssel vorhanden ist

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

Für python 3 verwenden Wörterbücher das Schlüsselwort in anstelle von has_key

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

Bei der Verwendung von os.environ ist Folgendes zu beachten:

Obwohl untergeordnete Prozesse die Umgebung vom übergeordneten Prozess erben, war ich kürzlich auf ein Problem gestoßen und hatte herausgefunden, ob andere Skripts die Umgebung aktualisieren, während Ihr Skript python ausgeführt wird, und habe os.environ erneut aufgerufen spiegelt nicht die neuesten Werte wider .

Auszug aus dem docs :

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

os.environ.data, in dem alle Umgebungsvariablen gespeichert sind, ist ein diktiertes Objekt, das alle Umgebungswerte enthält:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>
45
sisanared

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 es eingestellt habe.

Verwenden Sie einfach os.environ["DEBUSSY"] wie in

some_value = os.environ["DEBUSSY"]
18
Jim Brissom

Sie sollten der Umgebungsvariablen einen Zeichenfolgewert 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. Sie ändern den Wert nicht dauerhaft. Die untergeordneten Prozesse erben automatisch die Umgebung des übergeordneten Prozesses.

enter image description here

16
RejeeshChandran

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

14
ThiefMaster

variable setzen:

Zuweisungsmethode mit Taste:

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 object way ausprobieren.

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
12

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

Ein Problem, das ich hatte, ist, dass wenn ich versuchte, os.system zu verwenden, um eine Batch-Datei auszuführen, die Ihre Umgebungsvariablen festlegt (mit dem SET-Befehl in einer **. Bat * -Datei), diese nicht wirklich für Ihre festgelegt würden python-Umgebung (außer für den untergeordneten Prozess, der mit der Funktion os.system erstellt wird). Um die in der python -Umgebung gesetzten Variablen tatsächlich zu erhalten, verwende ich das folgende 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
10
Ricardo Alejos

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 den in diesem Frage beschriebenen modified_environ -Kontextmanager, um die Umgebungsvariablen wiederherzustellen.

Klassische Verwendung:

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

Es sollte beachtet werden, dass, wenn Sie versuchen, die Umgebungsvariable auf eine Bash-Auswertung zu setzen, diese nicht speichert, was Sie erwarten. Beispiel:

from os import environ

environ["Java_HOME"] = "$(/usr/libexec/Java_home)"

Dies wird nicht wie in einer Shell ausgewertet. Statt /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home als 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("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)
2
Josh Correia