Ympäristömuuttujien hakeminen, lisääminen, ylikirjoittaminen ja poistaminen Pythonissa (os.environ)

liiketoiminta

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.