Hoe omgevingsvariabelen instellen in Python?

Ik moet een aantal omgevingsvariabelen instellen in het Python-script en ik wil dat alle andere scripts die vanuit Python worden aangeroepen, de set van omgevingsvariabelen zien.

Als ik dat doe,

os.environ["DEBUSSY"] = 1

het klaagt dat 1een string moet zijn.

Ik wil ook weten hoe ik de omgevingsvariabelen in Python moet lezen (in het laatste deel van het script) als ik het eenmaal heb ingesteld.


Antwoord 1, autoriteit 100%

Omgevingsvariabelen moeten strings zijn, dus gebruik

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

om de variabele DEBUSSYin te stellen op de tekenreeks 1.

Om later toegang te krijgen tot deze variabele, gebruik je gewoon:

print(os.environ["DEBUSSY"])

Onderliggende processen nemen automatisch de omgevingsvariabelen van het bovenliggende proces over — er is geen speciale actie van uw kant vereist.


Antwoord 2, autoriteit 13%

Mogelijk moet u nog enkele andere aspecten overwegen voor de robuustheid van de code;

wanneer u een variabele met een geheel getal opslaat als een omgevingsvariabele, probeer dan

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

Voor het ophalen, bedenk dat je het moet proberen om fouten te voorkomen

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

vervang eventueel ‘-1’ voor ‘Niet ingesteld’

dus, om dat allemaal samen te vatten

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)

Antwoord 3, autoriteit 10%

os.environgedraagt zich als een python-woordenboek, dus alle algemene woordenboekbewerkingen kunnen worden uitgevoerd. Naast de bewerkingen geten setdie in de andere antwoorden worden genoemd, kunnen we ook eenvoudig controleren of een sleutel bestaat. De sleutels en waarden moeten worden opgeslagen als strings.

Python 3

Voor python 3 gebruiken woordenboeken het trefwoord inin plaats van 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'

Er is één belangrijk ding om op te merken bij het gebruik van os.environ:

Hoewel onderliggende processen de omgeving erven van het bovenliggende proces, was ik onlangs een probleem tegengekomen en kwam ik erachter dat als je andere scripts hebt die de omgeving bijwerken terwijl je python-script draait, os.environnogmaals zal niet de laatste waarden weergeven.

Uittreksel uit de docs:

Deze toewijzing wordt vastgelegd wanneer de os-module voor het eerst wordt geïmporteerd,
meestal tijdens het opstarten van Python als onderdeel van het verwerken van site.py. Veranderingen
aan het milieu gemaakt na deze tijd worden niet weerspiegeld in
os.environ, behalve voor wijzigingen die zijn aangebracht door os.environ rechtstreeks aan te passen.

os.environ.datadie alle omgevingsvariabelen opslaat, is een dict-object, dat alle omgevingswaarden bevat:

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

Antwoord 4, autoriteit 3%

Voordat u deze methode gebruikt, dient u de secties met opmerkingen te doorlopen

Ik heb geprobeerd omgevingsvariabelen toe te voegen. Mijn doel was om wat gebruikersinformatie op te slaan in systeemvariabelen, zodat ik die variabelen kan gebruiken voor toekomstige oplossingen, als alternatief voor configuratiebestanden.
De methode die in de onderstaande code wordt beschreven, heeft me echter helemaal niet geholpen.

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

Dit eenvoudige codeblok werkt goed, maar deze variabelen bestaan binnen de respectieve processen, zodat u ze niet zult vinden op het tabblad met omgevingsvariabelen van de systeeminstellingen van Windows. Vrijwel bovenstaande code diende mijn doel niet. Dit probleem wordt hier besproken: probleem met het opslaan van variabelen

os.environ.putenv(key, value)

een andere niet-succesvolle poging. Dus, ten slotte, heb ik erin geslaagd om variabelen met succes in het raamomgevingregister te redden door de Windows Shell-opdrachten te mimuleren die in de systeemklasse van OS-pakket zijn gewikkeld. De volgende code beschrijft deze succesvolle poging.

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

Ik hoop dat dit nuttig zal zijn voor sommigen van jullie.


Antwoord 5, Autoriteit 2%

Als ik os.environ [“Debussy”] = 1, het
klaagt zeggen dat ik moet zijn
string.

Doe dan

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

Ik wil ook weten hoe ik de
Milieuvariabelen in Python (in de
later deel van het script) als ik eenmaal heb ingesteld
het.

Gebruik gewoon os.environ["DEBUSSY"], zoals in

some_value = os.environ["DEBUSSY"]

Antwoord 6, Autoriteit 2%

Variabele instellen:

Item toewijzingsmethode met behulp van de toets:

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

om te krijgen of om te controleren of het bestond of niet,

Sinds os.environ is een instantie die u objectemperatuur kunt proberen.

Methode 1:

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

krijgt '1'als retourwaarde

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

Antwoord 7, autoriteit 2%

U moet een tekenreekswaarde toewijzen aan de omgevingsvariabele.

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

Als je de omgevingsvariabele wilt lezen of afdrukken, gebruik dan gewoon

print os.environ["DEBUSSY"]

Deze wijziging is alleen van kracht voor het huidige proces waaraan deze is toegewezen, de waarde wordt niet permanent gewijzigd. De onderliggende processen zullen automatisch de omgeving van het bovenliggende proces erven.


Antwoord 8, autoriteit 2%

Hoe zit het met os.environ["DEBUSSY"] = '1'? Omgevingsvariabelen zijn altijd strings.


Antwoord 9

Opgemerkt moet worden dat als u de omgevingsvariabele probeert in te stellen op een bash-evaluatie, deze nietopslaat wat u verwacht. Voorbeeld:

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

Dit evalueert het niet zoals in een shell, dus in plaats van /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeals pad te krijgen de letterlijke uitdrukking $(/usr/libexec/java_home).

Zorg ervoor dat u het evalueert voordat u de omgevingsvariabele instelt, zoals:

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

Antwoord 10

U kunt het woordenboek os.environgebruiken om toegang te krijgen tot uw omgevingsvariabelen.

Een probleem dat ik had, was dat als ik probeerde os.systemte gebruiken om een batchbestand uit te voeren dat je omgevingsvariabelen instelt (met de opdracht SET in een **.bat*-bestand) het zou ze niet echt instellen voor je python-omgeving (maar voor het onderliggende proces dat is gemaakt met de functie os.system). Om de variabelen daadwerkelijk in de python-omgeving te krijgen, gebruik ik dit 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

Antwoord 11

Wanneer u met Milieuvariabelen afspeelt (variabelen toevoegen / wijzigen / wijzigen / verwijderen), is een goede praktijk om de vorige staat bij de voltooiing van de functie te herstellen.

Mogelijk hebt u iets nodig als de modified_environcontext manager beschrijven in deze vraag om het te herstellen Milieuvariabelen.

Klassiek gebruik:

with modified_environ(DEBUSSY="1"):
    call_my_function()

Antwoord 12

Gebruik setdefaultFunctie om een ​​nieuwe variabele in te stellen als de variabele niet in het milieu bestaat.

Zorg ervoor dat u de variabele van het milieu instelt als een string, niet int. Anders gooien TypeError.

import os
if not os.environ.get("DEBUSSY"):
    os.environ.setdefault("DEBUSSY","1")
else:
     os.environ["DEBUSSY"] = "1"
print(os.environ["DEBUSSY"])

Antwoord 13

Er is goed uit de doos Python-oplossing genaamd pycroskit .
Het zorgt voor milieuvariabelen die zowel voor Linux als Windows volharden.

Gebruik:

# Will Set Persistent Value for Variable in System
# * subkey works only for windows like file in folder
# * reg_path works only for windows as register path 
SysEnv.set_var(name, value, subkey, reg_path=default_reg_path)
# Will Get Persistent Value for Variable in System
# * reg_path works only for windows as register path
# * delete, deletes key from environment and its subkeys after read
SysEnv.get_var(name, reg_path=default_reg_path, delete=False)

Antwoord 14

Als je worstelt met Flask en unittest, onthoud dan dat als je een variabele instelt buiten een methode, deze variabele wordt gelezen wanneer je de app importeert. Het lijkt misschien triviaal, maar kan iemand hoofdpijn besparen.

Als je bijvoorbeeld in je Flask-eenheid test:

  1. importeer de app
  2. stel de omgevingsvariabele in de setUpmethode in.
  3. gebruik app.test_client()om uw applicatie te testen

De variabele in de tweede stap zal niet worden gezien door de derde stap, omdat de variabele al is gelezen wanneer u de eerste stap uitvoert.

Other episodes