Ympäristömuuttujia voidaan hakea, tarkistaa, asettaa (lisätä tai korvata) ja poistaa Python-ohjelmissa käyttämällä os.environ-tiedostoa. Huomaa, että ympäristömuuttujia asettamalla tai poistamalla tehdyt muutokset ovat voimassa vain Python-ohjelmassa. Se ei tarkoita, että järjestelmän ympäristömuuttujat kirjoitetaan uudelleen.
Seuraavat tiedot annetaan tässä.
os.environ
- Hae ympäristömuuttujat.
- Aseta (add\overwrite) ympäristömuuttujat.
- Poista ympäristömuuttujat
- Ympäristömuuttujien muuttumisen vaikutus
- Prosessien vaihtaminen ympäristömuuttujien avulla
Tuo ja käytä os-moduulia. Koska se on standardikirjasto, lisäasennusta ei tarvita. Myös subprocess-moduuli sisältyy standardikirjastoon.
import os
import subprocess
os.environ
Os.environin tyyppi on os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ on map-tyyppinen objekti, jossa on avain- ja arvopari, ja sillä on samat metodit kuin sanakirjalla (dict-tyyppi). Ympäristömuuttujan nimi on key ja sen arvo on value.
Os.environ-tiedoston sisältö ladataan, kun os-moduuli tuodaan. Os.environ-tiedoston sisältöä ei päivitetä, vaikka järjestelmän ympäristömuuttujia muutettaisiin muulla tavoin ohjelman suorituksen aikana.
Lista näytetään komennolla print().
# print(os.environ)
Kuten sanakirjan kohdalla, voit käyttää seuraavia menetelmiä tai tarkistaa avainten ja arvojen olemassaolon in-menetelmällä.
keys()
values()
Avainten ja arvojen käsittely on periaatteessa sama kuin sanakirjoissa. Seuraavassa annetaan esimerkkejä.
Hae ympäristömuuttujat.
os.environ[Environment variable name]
Näin saat ympäristömuuttujan arvon, mutta jos määrität ympäristömuuttujan nimen, jota ei ole olemassa, saat virheilmoituksen (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Os.environ-metodin get()-menetelmää voidaan käyttää oletusarvon saamiseksi, jos sitä ei ole olemassa. Tämä on myös sama kuin sanakirja.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Lisäksi tarjotaan funktio os.getenv(). Kuten sanakirjan get()-metodi, se palauttaa oletusarvon, jos avainta ei ole olemassa. Tämä funktio on hyödyllinen, jos haluat vain saada ja tarkistaa ympäristömuuttujan arvon.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Aseta (add\overwrite) ympäristömuuttujat.
os.environ[Environment variable name]
Määrittämällä tälle arvon voit asettaa ympäristömuuttujan.
Kun määritetään uuden ympäristömuuttujan nimi, ympäristömuuttuja lisätään, ja kun määritetään olemassa olevan ympäristömuuttujan nimi, ympäristömuuttujan arvo korvataan.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Huomaa, että muun kuin merkkijonon osoittaminen aiheuttaa virheen (TypeError). Jos haluat määrittää numeerisen arvon, määritä se merkkijonona.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Myös toiminto os.putenv() tarjotaan. Os.environ:n arvoa ei kuitenkaan päivitetä, kun se asetetaan os.putenv()-funktiolla. Tästä syystä on parempi määrittää os.environin avain (ympäristömuuttujan nimi) ja määrittää arvo yllä olevan esimerkin mukaisesti.
Jos putenv() on tuettu, osoitus os.environ-olion kohteelle muunnetaan automaattisesti vastaavaksi kutsuksi putenv():lle. Käytännössä os.environ-olion osoittaminen on suositeltavampi toiminto, koska suora kutsu putenv()-ohjelmaan ei päivitä os.environ-oliota.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Kuten aiemmin mainittiin, ympäristömuuttujia lisäämällä tai korvaamalla tehdyt muutokset vaikuttavat vain Python-ohjelmassa. Se ei tarkoita, että järjestelmän ympäristömuuttujat kirjoitetaan uudelleen.
Huomaa, että arvon muuttaminen voi aiheuttaa muistivuodon käyttöjärjestelmästä riippuen.
Huomautus: Joillakin alustoilla, kuten FreeBSD:ssä ja Mac OS X:ssä, environ-arvon muuttaminen voi aiheuttaa muistivuodon.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Tämä johtuu käyttöjärjestelmän putenv()-määrittelystä.
Successive calls to setenv() or putenv() assigning a differently sized value to the same name will result in a memory leak. The FreeBSD seman-tics semantics for these functions (namely, that the contents of value are copied and that old values remain accessible indefinitely) make this bug unavoidable.
Mac OS X Manual Page For putenv(3)
Poista ympäristömuuttujat
Voit poistaa ympäristömuuttujan käyttämällä os.environ-metodin pop()-menetelmää tai del-lauseketta. Sama kuin dictionary.
Seuraavassa on esimerkki pop() -toiminnosta.
pop() palauttaa poistetun ympäristömuuttujan arvon. Oletusarvoisesti sellaisen ympäristömuuttujan määrittäminen, jota ei ole olemassa, johtaa virheeseen (KeyError), mutta toisen argumentin määrittäminen palauttaa ympäristömuuttujan arvon, jos sitä ei ole olemassa.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Seuraavassa on esimerkki del.
Ympäristömuuttuja lisätään uudelleen ja poistetaan sitten. Jos ympäristömuuttujaa ei ole olemassa, annetaan virheilmoitus (KeyError).
os.environ['NEW_KEY'] = '100'
print(os.getenv('NEW_KEY'))
# 100
del os.environ['NEW_KEY']
print(os.getenv('NEW_KEY'))
# None
# del os.environ['NEW_KEY']
# KeyError: 'NEW_KEY'
Lisäksi tarjotaan funktio os.unsetenv(). Kuten os.putenv()-funktiossa, os.environ:n arvoa ei kuitenkaan päivitetä, kun se poistetaan os.unsetenv()-funktiolla. Siksi on parempi määrittää avain (ympäristömuuttujan nimi) os.environ ja poistaa se yllä olevan esimerkin mukaisesti.
Jos unsetenv() on tuettu, os.environ-olion poistaminen johtaa automaattisesti vastaavaan unsetenv()-kutsuun. Käytännössä kohteiden poistaminen os.environ-tiedostosta on suositeltavampi toiminto, koska suorat kutsut unsetenv()-ohjelmalle eivät päivitä os.environ-tiedostoa.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ympäristömuuttujien poistaminen vaikuttaa myös vain kyseisen Python-ohjelman sisällä. Se ei poista järjestelmän ympäristömuuttujia.
Ympäristömuuttujien muuttumisen vaikutus
Kuten olen toistuvasti kirjoittanut, os.environ-ympäristömuuttujan muuttaminen (asettaminen tai poistaminen) ei muuta järjestelmän ympäristömuuttujaa, mutta se vaikuttaa ohjelmassa käynnistettäviin aliprosesseihin.
Seuraava koodi ei toimi odotetusti Windowsissa, koska LANG-ympäristömuuttujaa ei ole ja date-komennon sisältö on erilainen.
Date-komennon kutsuminen aliprosessimoduulissa.
Date-komennon tulostustulos muuttuu LANG-ympäristömuuttujan arvon mukaan.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(subprocess.check_output('date', encoding='utf-8'))
# 2018年 7月12日 木曜日 20時54分13秒 JST
#
os.environ['LANG'] = 'en_US'
print(subprocess.check_output('date', encoding='utf-8'))
# Thu Jul 12 20:54:13 JST 2018
#
Selityksen vuoksi olemme muuttaneet LANG-ympäristömuuttujaa os.environ-tiedostossa, mutta Python tarjoaa locale-moduulin, jonka avulla voit hallita paikallisuutta.
Prosessien vaihtaminen ympäristömuuttujien avulla
On myös mahdollista vaihtaa prosessi ympäristömuuttujan arvon mukaan.
Seuraavassa on esimerkki tulosteen muuttamisesta kieliasetusten LANG-ympäristömuuttujan mukaan. Tässä käytämme startswith()-menetelmää sen määrittämiseen, alkaako merkkijono määritetyn merkkijonon kanssa, mutta jos haluat määrittää tarkan vastaavuuden, voit käyttää vertailuun ”==”-menetelmää.
print(os.getenv('LANG'))
# en_US
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# Hello
os.environ['LANG'] = 'ja_JP'
if os.getenv('LANG').startswith('ja'):
print('こんにちは')
else:
print('Hello')
# こんにちは
Lisäksi, jos ympäristömuuttujat on asetettu osoittamaan esimerkiksi kehitysympäristöä ja tuotantoympäristöä, voit saada näiden muuttujien arvot ja vaihtaa prosessia.