Pemboleh ubah persekitaran dapat diambil, diperiksa, diset (ditambahkan atau ditimpa), dan dihapus dalam program Python menggunakan os.environ. Perhatikan bahawa perubahan yang dibuat dengan menetapkan atau menghapus pemboleh ubah persekitaran hanya berkesan dalam program Python. Ini tidak bermaksud bahawa pemboleh ubah persekitaran sistem akan ditulis semula.
Maklumat berikut diberikan di sini.
os.environ
- Dapatkan pemboleh ubah persekitaran.
- Tetapkan (tambah / ganti) pemboleh ubah persekitaran
- Keluarkan pemboleh ubah persekitaran
- Kesan perubahan pemboleh ubah persekitaran
- Proses pensuisan mengikut pemboleh ubah persekitaran
Import dan gunakan modul os. Oleh kerana ia adalah perpustakaan standard, tidak diperlukan pemasangan tambahan. Modul subproses juga termasuk dalam pustaka standard.
import os
import subprocess
os.environ
Jenis os.environ adalah os._Environ.
print(type(os.environ))
# <class 'os._Environ'>
os._Environ adalah objek jenis peta dengan sepasang kunci dan nilai, dan mempunyai kaedah yang sama dengan kamus (jenis perintah). Nama pemboleh ubah persekitaran adalah kunci, dan nilainya adalah nilai.
Kandungan os.environ akan dimuat semasa modul os diimport. Kandungan os.environ tidak akan dikemas kini walaupun pemboleh ubah persekitaran sistem diubah dengan cara lain semasa program dijalankan.
Senarai dipaparkan dengan cetakan ().
# print(os.environ)
Seperti kamus, anda boleh menggunakan kaedah berikut, atau gunakan untuk memeriksa keberadaan kunci dan nilai.
keys()
values()
Pemprosesan kunci dan nilai pada dasarnya sama seperti kamus. Contohnya diberikan di bawah.
Dapatkan pemboleh ubah persekitaran.
os.environ[Environment variable name]
Ini akan membolehkan anda mendapatkan nilai pemboleh ubah persekitaran, tetapi jika anda menentukan nama pemboleh ubah persekitaran yang tidak ada, anda akan mendapat ralat (KeyError).
print(os.environ['LANG'])
# ja_JP.UTF-8
# print(os.environ['NEW_KEY'])
# KeyError: 'NEW_KEY'
Kaedah get () os.environ boleh digunakan untuk mendapatkan nilai lalai jika tidak ada. Ini juga sama dengan kamus.
print(os.environ.get('LANG'))
# ja_JP.UTF-8
print(os.environ.get('NEW_KEY'))
# None
print(os.environ.get('NEW_KEY', 'default'))
# default
Fungsi os.getenv () juga disediakan. Seperti kaedah get () kamus, ia mengembalikan nilai lalai jika kuncinya tidak ada. Fungsi ini berguna jika anda hanya ingin mendapatkan dan memeriksa nilai pemboleh ubah persekitaran.
print(os.getenv('LANG'))
# ja_JP.UTF-8
print(os.getenv('NEW_KEY'))
# None
print(os.getenv('NEW_KEY', 'default'))
# default
Tetapkan (tambah / ganti) pemboleh ubah persekitaran
os.environ[Environment variable name]
Dengan memberikan nilai untuk ini, anda dapat menetapkan pemboleh ubah persekitaran.
Apabila nama pemboleh ubah persekitaran baru ditentukan, pemboleh ubah lingkungan baru ditambahkan, dan ketika nama pemboleh ubah lingkungan yang ada ditentukan, nilai pemboleh ubah lingkungan ditimpa.
os.environ['NEW_KEY'] = 'test'
print(os.environ['NEW_KEY'])
# test
os.environ['NEW_KEY'] = 'test2'
print(os.environ['NEW_KEY'])
# test2
Perhatikan bahawa menetapkan apa-apa selain rentetan akan menghasilkan ralat (TypeError). Sekiranya anda ingin memberikan nilai berangka, nyatakan sebagai rentetan.
# os.environ['NEW_KEY'] = 100
# TypeError: str expected, not int
os.environ['NEW_KEY'] = '100'
Fungsi os.putenv () juga disediakan. Walau bagaimanapun, nilai os.environ tidak dikemas kini apabila ditetapkan oleh os.putenv (). Atas sebab ini, lebih baik menentukan kunci (nama pemboleh ubah persekitaran) os.environ dan memberikan nilai seperti yang ditunjukkan dalam contoh di atas.
Sekiranya putenv () didukung, tugas ke item di os.environ secara automatik akan ditukar menjadi panggilan yang sesuai ke putenv (). Dalam praktiknya, menetapkan ke item di os.environ adalah operasi yang disukai, kerana panggilan langsung ke putenv () tidak akan mengemas kini os.environ.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Seperti disebutkan sebelumnya, perubahan yang dilakukan dengan menambahkan atau menimpa pemboleh ubah persekitaran hanya berkesan dalam program Python. Ini tidak bermaksud bahawa pemboleh ubah persekitaran sistem akan ditulis semula.
Perhatikan bahawa mengubah nilai boleh menyebabkan kebocoran memori bergantung pada OS.
Catatan: Di beberapa platform, termasuk FreeBSD dan Mac OS X, mengubah nilai persekitaran boleh menyebabkan kebocoran memori.
os.putenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Ini disebabkan oleh spesifikasi putenv () OS itu sendiri.
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)
Keluarkan pemboleh ubah persekitaran
Untuk menghapus pemboleh ubah persekitaran, gunakan kaedah pop () os.environ atau pernyataan del. Sama seperti kamus.
Berikut adalah contoh pop ().
pop () mengembalikan nilai pemboleh ubah persekitaran yang telah dipadam. Secara lalai, menentukan pemboleh ubah persekitaran yang tidak ada akan menghasilkan ralat (KeyError), tetapi menentukan argumen kedua akan mengembalikan nilai pemboleh ubah lingkungan jika tidak ada.
print(os.environ.pop('NEW_KEY'))
# 100
# print(os.environ.pop('NEW_KEY'))
# KeyError: 'NEW_KEY'
print(os.environ.pop('NEW_KEY', None))
# None
Berikut adalah contoh del.
Pemboleh ubah persekitaran ditambahkan lagi, dan kemudian dipadamkan. Sekiranya pemboleh ubah persekitaran tidak ada, ralat (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'
Fungsi os.unsetenv () juga disediakan. Namun, seperti os.putenv (), nilai os.environ tidak dikemas kini apabila dihapus oleh os.unsetenv (). Oleh itu, lebih baik menentukan kunci (nama pemboleh ubah persekitaran) os.environ dan menghapusnya seperti yang ditunjukkan dalam contoh di atas.
Sekiranya unsetenv () disokong, penghapusan item di os.environ secara automatik akan diterjemahkan ke panggilan yang sepadan dengan unsetenv (). Dalam praktiknya, menghapus item di os.environ adalah operasi pilihan, kerana panggilan terus ke unsetenv () tidak akan mengemas kini os.environ.
os.unsetenv() — Miscellaneous operating system interfaces — Python 3.10.0 Documentation
Menghapus pemboleh ubah persekitaran juga berkesan hanya dalam program Python itu. Ia tidak membuang pemboleh ubah persekitaran sistem.
Kesan perubahan pemboleh ubah persekitaran
Seperti yang telah saya tulis berulang kali, mengubah (menetapkan atau menghapus) pemboleh ubah persekitaran os.environ tidak mengubah pemboleh ubah persekitaran sistem, tetapi mempengaruhi sub-proses yang dilancarkan dalam program.
Kod berikut tidak akan berfungsi seperti yang diharapkan pada Windows kerana tidak ada pemboleh ubah persekitaran LANG dan kandungan perintah tarikhnya berbeza.
Memanggil arahan tarikh dalam modul subproses.
Hasil keluaran arahan tarikh berubah bergantung pada nilai pemboleh ubah persekitaran 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
#
Demi penjelasan, kami telah mengubah pemboleh ubah persekitaran LANG di os.environ, tetapi Python menyediakan modul lokal untuk mengawal lokasi.
Proses pensuisan mengikut pemboleh ubah persekitaran
Adalah mungkin juga untuk menukar proses mengikut nilai pemboleh ubah persekitaran.
Berikut adalah contoh menukar output mengikut pemboleh ubah persekitaran LANG dalam tetapan bahasa. Di sini kita menggunakan kaedah startswith () untuk menentukan apakah rentetan bermula dengan rentetan yang ditentukan, tetapi jika anda ingin menentukan padanan yang tepat, anda boleh menggunakan “==” untuk membandingkan.
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')
# こんにちは
Sebagai tambahan, jika pemboleh ubah lingkungan ditetapkan untuk menunjukkan lingkungan pengembangan dan lingkungan produksi, misalnya, Anda dapat memperoleh nilai pemboleh ubah ini dan mengubah prosesnya.