Λήψη, προσθήκη, αντικατάσταση και διαγραφή μεταβλητών περιβάλλοντος στην Python (os.environ)

Επιχείρηση

Οι μεταβλητές περιβάλλοντος μπορούν να ανακτηθούν, να ελεγχθούν, να οριστούν (να προστεθούν ή να αντικατασταθούν) και να διαγραφούν σε προγράμματα Python χρησιμοποιώντας το os.environ. Σημειώστε ότι οι αλλαγές που γίνονται με τον ορισμό ή τη διαγραφή μεταβλητών περιβάλλοντος ισχύουν μόνο μέσα στο πρόγραμμα της Python. Δεν σημαίνει ότι οι μεταβλητές περιβάλλοντος του συστήματος θα ξαναγραφούν.

Οι ακόλουθες πληροφορίες παρέχονται εδώ.

  • os.environ
  • Λήψη μεταβλητών περιβάλλοντος.
  • Ορισμός (add\overwrite) μεταβλητών περιβάλλοντος
  • Αφαίρεση μεταβλητών περιβάλλοντος
  • Επίδραση της μεταβολής των περιβαλλοντικών μεταβλητών
  • Εναλλαγή διεργασιών μέσω μεταβλητών περιβάλλοντος

Εισαγωγή και χρήση της ενότητας os. Δεδομένου ότι πρόκειται για μια τυπική βιβλιοθήκη, δεν απαιτείται πρόσθετη εγκατάσταση. Η ενότητα subprocess περιλαμβάνεται επίσης στην τυπική βιβλιοθήκη.

import os
import subprocess

os.environ

Ο τύπος του os.environ είναι os._Environ.

print(type(os.environ))
# <class 'os._Environ'>

Το os._Environ είναι ένα αντικείμενο τύπου map με ένα ζεύγος κλειδιού και τιμής και έχει τις ίδιες μεθόδους με ένα λεξικό (τύπου dict). Το όνομα της μεταβλητής περιβάλλοντος είναι το key και η τιμή της είναι η value.

Τα περιεχόμενα του os.environ θα φορτωθούν όταν εισαχθεί η ενότητα os. Τα περιεχόμενα του os.environ δεν θα ενημερωθούν ακόμα και αν οι μεταβλητές περιβάλλοντος του συστήματος αλλάξουν με άλλα μέσα κατά τη διάρκεια της εκτέλεσης του προγράμματος.

Η λίστα εμφανίζεται με την print().

# print(os.environ)

Όπως και με το λεξικό, μπορείτε να χρησιμοποιήσετε τις ακόλουθες μεθόδους ή να χρησιμοποιήσετε την in για να ελέγξετε την ύπαρξη κλειδιών και τιμών.

  • keys()
  • values()

Η επεξεργασία των κλειδιών και των τιμών είναι βασικά η ίδια με αυτή των λεξικών. Παραδείγματα δίνονται παρακάτω.

Λήψη μεταβλητών περιβάλλοντος.

os.environ[Environment variable name]
Αυτό θα σας επιτρέψει να λάβετε την τιμή της μεταβλητής περιβάλλοντος, αλλά αν καθορίσετε ένα όνομα μεταβλητής περιβάλλοντος που δεν υπάρχει, θα λάβετε ένα σφάλμα (KeyError).

print(os.environ['LANG'])
# ja_JP.UTF-8

# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'

Η μέθοδος get() του os.environ μπορεί να χρησιμοποιηθεί για να ληφθεί η προεπιλεγμένη τιμή, εάν δεν υπάρχει. Αυτό είναι επίσης το ίδιο με το λεξικό.

print(os.environ.get('LANG'))
# ja_JP.UTF-8

print(os.environ.get('NEW_KEY'))
# None

print(os.environ.get('NEW_KEY', 'default'))
# default

Παρέχεται επίσης η συνάρτηση os.getenv(). Όπως και η μέθοδος get() του λεξικού, επιστρέφει την προεπιλεγμένη τιμή αν το κλειδί δεν υπάρχει. Αυτή η συνάρτηση είναι χρήσιμη αν θέλετε απλώς να λάβετε και να ελέγξετε την τιμή μιας μεταβλητής περιβάλλοντος.

print(os.getenv('LANG'))
# ja_JP.UTF-8

print(os.getenv('NEW_KEY'))
# None

print(os.getenv('NEW_KEY', 'default'))
# default

Ορισμός (add\overwrite) μεταβλητών περιβάλλοντος

os.environ[Environment variable name]
Αναθέτοντας μια τιμή σε αυτό, μπορείτε να ορίσετε μια μεταβλητή περιβάλλοντος.

Όταν καθορίζεται ένα νέο όνομα μεταβλητής περιβάλλοντος, η μεταβλητή περιβάλλοντος προστίθεται εκ νέου, ενώ όταν καθορίζεται ένα υπάρχον όνομα μεταβλητής περιβάλλοντος, η τιμή της μεταβλητής περιβάλλοντος αντικαθίσταται.

os.environ['NEW_KEY'] = 'test'

print(os.environ['NEW_KEY'])
# test

os.environ['NEW_KEY'] = 'test2'

print(os.environ['NEW_KEY'])
# test2

Σημειώστε ότι η ανάθεση οτιδήποτε άλλου εκτός από μια συμβολοσειρά θα οδηγήσει σε σφάλμα (TypeError). Αν θέλετε να εκχωρήσετε μια αριθμητική τιμή, καθορίστε την ως συμβολοσειρά.

# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int

os.environ['NEW_KEY'] = '100'

Παρέχεται επίσης η συνάρτηση os.putenv(). Ωστόσο, η τιμή του os.environ δεν ενημερώνεται όταν ορίζεται από την os.putenv(). Για το λόγο αυτό, είναι προτιμότερο να καθορίσετε το κλειδί (όνομα μεταβλητής περιβάλλοντος) της os.environ και να εκχωρήσετε την τιμή, όπως φαίνεται στο παραπάνω παράδειγμα.

Αν υποστηρίζεται η putenv(), μια ανάθεση σε ένα στοιχείο στο os.environ θα μετατραπεί αυτόματα σε μια αντίστοιχη κλήση στην putenv(). Στην πράξη, η ανάθεση σε ένα στοιχείο στο os.environ είναι η προτιμώμενη λειτουργία, καθώς μια άμεση κλήση της putenv() δεν θα ενημερώσει το os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Όπως αναφέρθηκε προηγουμένως, οι αλλαγές που γίνονται με την προσθήκη ή την αντικατάσταση μεταβλητών περιβάλλοντος ισχύουν μόνο μέσα στο πρόγραμμα Python. Αυτό δεν σημαίνει ότι οι μεταβλητές περιβάλλοντος του συστήματος θα ξαναγραφούν.

Σημειώστε ότι η αλλαγή της τιμής μπορεί να προκαλέσει διαρροή μνήμης ανάλογα με το λειτουργικό σύστημα.

Σημείωση: Σε ορισμένες πλατφόρμες, συμπεριλαμβανομένων των FreeBSD και Mac OS X, η αλλαγή της τιμής του environ μπορεί να προκαλέσει διαρροή μνήμης.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Αυτό οφείλεται στην προδιαγραφή putenv() του ίδιου του λειτουργικού συστήματος.

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)

Αφαίρεση μεταβλητών περιβάλλοντος

Για να διαγράψετε μια μεταβλητή περιβάλλοντος, χρησιμοποιήστε τη μέθοδο pop() της os.environ ή τη δήλωση del. Το ίδιο με το λεξικό.

Ακολουθεί ένα παράδειγμα της pop().

Η pop() επιστρέφει την τιμή της μεταβλητής περιβάλλοντος που διαγράφηκε. Από προεπιλογή, ο προσδιορισμός μιας μεταβλητής περιβάλλοντος που δεν υπάρχει θα οδηγήσει σε σφάλμα (KeyError), αλλά ο προσδιορισμός του δεύτερου ορίσματος θα επιστρέψει την τιμή της μεταβλητής περιβάλλοντος αν δεν υπάρχει.

print(os.environ.pop('NEW_KEY'))
# 100

# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'

print(os.environ.pop('NEW_KEY', None))
# None

Ακολουθεί ένα παράδειγμα της del.

Η μεταβλητή περιβάλλοντος προστίθεται ξανά και στη συνέχεια διαγράφεται. Εάν η μεταβλητή περιβάλλοντος δεν υπάρχει, εμφανίζεται σφάλμα (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'

Παρέχεται επίσης η συνάρτηση os.unsetenv(). Ωστόσο, όπως και με την os.putenv(), η τιμή της os.environ δεν ενημερώνεται όταν διαγράφεται από την os.unsetenv(). Επομένως, είναι προτιμότερο να καθορίσετε το κλειδί (όνομα μεταβλητής περιβάλλοντος) της os.environ και να τη διαγράψετε όπως φαίνεται στο παραπάνω παράδειγμα.

Αν υποστηρίζεται η unsetenv(), η διαγραφή ενός στοιχείου στο os.environ θα μεταφραστεί αυτόματα στην αντίστοιχη κλήση της unsetenv(). Στην πράξη, η διαγραφή στοιχείων στο os.environ είναι η προτιμώμενη λειτουργία, καθώς οι άμεσες κλήσεις στην unsetenv() δεν θα ενημερώσουν το os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Η διαγραφή μεταβλητών περιβάλλοντος είναι επίσης αποτελεσματική μόνο μέσα στο συγκεκριμένο πρόγραμμα Python. Δεν διαγράφει τις μεταβλητές περιβάλλοντος του συστήματος.

Επίδραση της μεταβολής των περιβαλλοντικών μεταβλητών

Όπως έχω γράψει επανειλημμένα, η αλλαγή (ρύθμιση ή διαγραφή) της μεταβλητής περιβάλλοντος os.environ δεν αλλάζει τη μεταβλητή περιβάλλοντος του συστήματος, αλλά επηρεάζει τις υποδιεργασίες που εκκινούνται στο πρόγραμμα.

Ο παρακάτω κώδικας δεν θα λειτουργήσει όπως αναμένεται στα Windows, επειδή δεν υπάρχει μεταβλητή περιβάλλοντος LANG και τα περιεχόμενα της εντολής date είναι διαφορετικά.

Κλήση της εντολής date στην ενότητα subprocess.

Το αποτέλεσμα εξόδου της εντολής date αλλάζει ανάλογα με την τιμή της μεταβλητής περιβάλλοντος LANG.

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
# 

Για λόγους επεξήγησης, έχουμε αλλάξει τη μεταβλητή περιβάλλοντος LANG στο os.environ, αλλά η Python παρέχει μια ενότητα locale για τον έλεγχο της τοπικής γλώσσας.

Εναλλαγή διεργασιών μέσω μεταβλητών περιβάλλοντος

Είναι επίσης δυνατή η εναλλαγή της διαδικασίας σύμφωνα με την τιμή μιας μεταβλητής περιβάλλοντος.

Ακολουθεί ένα παράδειγμα αλλαγής της εξόδου σύμφωνα με τη μεταβλητή περιβάλλοντος LANG στις ρυθμίσεις γλώσσας. Εδώ χρησιμοποιούμε τη μέθοδο startswith() για να προσδιορίσουμε αν η συμβολοσειρά αρχίζει με την καθορισμένη συμβολοσειρά, αλλά αν θέλετε να προσδιορίσετε την ακριβή αντιστοιχία, μπορείτε να χρησιμοποιήσετε το «==» για να συγκρίνετε.

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')
# こんにちは

Επιπλέον, αν έχουν οριστεί μεταβλητές περιβάλλοντος που υποδεικνύουν το περιβάλλον ανάπτυξης και το περιβάλλον παραγωγής, για παράδειγμα, μπορείτε να λάβετε τις τιμές αυτών των μεταβλητών και να αλλάξετε τη διαδικασία.

Copied title and URL