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 1
een 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 DEBUSSY
in 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.environ
gedraagt zich als een python-woordenboek, dus alle algemene woordenboekbewerkingen kunnen worden uitgevoerd. Naast de bewerkingen get
en set
die 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.environ
nogmaals 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.data
die 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/Home
als 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.environ
gebruiken om toegang te krijgen tot uw omgevingsvariabelen.
Een probleem dat ik had, was dat als ik probeerde os.system
te 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_environ
context manager beschrijven in deze vraag om het te herstellen Milieuvariabelen.
Klassiek gebruik:
with modified_environ(DEBUSSY="1"):
call_my_function()
Antwoord 12
Gebruik setdefault
Functie 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:
- importeer de app
- stel de omgevingsvariabele in de
setUp
methode in. - 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.