Saya perlu untuk mengatur beberapa variabel lingkungan dalam script python dan saya ingin semua skrip lain yang disebut dari python (shell script) yang akan menjadi proses anak untuk melihat variabel lingkungan yang ditetapkan. Nilai adalah angka.
Jika saya melakukan os.environ["DEBUSSY"] = 1
, itu mengeluh dan mengatakan bahwa 1
telah menjadi string.
Saya juga ingin tahu cara membaca lingkungan variabel di python (di bagian akhir naskah) setelah saya set.
Variabel lingkungan harus string, jadi gunakan
os.environ["DEBUSSY"] = "1"
untuk mengatur variabel DEBUSSY
string 1
.
Untuk mengakses variabel ini nanti, anda cukup gunakan:
print(os.environ["DEBUSSY"])
Proses anak secara otomatis mewarisi variabel lingkungan dari proses induk-tidak ada tindakan khusus pada bagian yang diperlukan.
Anda mungkin perlu mempertimbangkan beberapa aspek lebih lanjut untuk kode kekokohan;
bila anda're menyimpan integer-valued variabel sebagai variabel lingkungan, mencoba
os.environ['DEBUSSY'] = str(myintvariable)
kemudian untuk pengambilan, mempertimbangkan bahwa untuk menghindari kesalahan, anda harus mencoba
os.environ.get('DEBUSSY', 'Not Set')
mungkin pengganti '-1' untuk 'Tidak Diatur'
jadi, untuk menempatkan itu semua bersama-sama
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)
os.environ
berperilaku seperti python dictionary, sehingga semua kamus umum operasi-operasi yang dapat dilakukan. Selain untuk mendapatkan
dan mengatur
operasi yang disebutkan dalam jawaban yang lain, kita juga dapat hanya memeriksa apakah ada kunci
Python 3
Untuk python 3, kamus menggunakan di kata kunci bukan 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'
Ada satu hal penting yang harus diperhatikan tentang penggunaan os.environ
:
Meskipun proses anak mewarisi lingkungan dari proses induk, saya telah mengalami masalah ini dan tahu, jika anda memiliki script memperbarui lingkungan saat anda script python berjalan, memanggil os.environ
lagi tidak mencerminkan nilai pemesanan.
Kutipan dari docs:
pemetaan Ini ditangkap pertama kali os modul impor, biasanya selama Python startup sebagai bagian dari pengolahan site.py. Perubahan untuk lingkungan yang dibuat setelah waktu ini tidak tercermin dalam os.environ, kecuali untuk perubahan yang dibuat dengan memodifikasi os.lingkungan ini diatas.
os.environ.data
yang menyimpan semua variabel lingkungan, adalah sebuah dict objek, yang berisi semua nilai-nilai lingkungan:
>>> type(os.environ.data) # changed to _data since v3.2 (refer comment below)
<type 'dict'>
jika saya lakukan os.environ["DEBUSSY"] = 1, mengeluh mengatakan bahwa 1 harus string.
Kemudian lakukan
os.environ["DEBUSSY"] = "1"
aku juga ingin tahu bagaimana untuk membaca lingkungan variabel di python(dalam kemudian bagian dari script) setelah saya set hal.
Hanya menggunakan os.environ["DEBUSSY"]
, seperti dalam
some_value = os.environ["DEBUSSY"]
Anda harus menetapkan nilai string ke variabel lingkungan.
os.environ["DEBUSSY"] = "1"
Jika anda ingin membaca atau cetak variabel lingkungan hanya menggunakan
cetak os.environ["DEBUSSY"]
Perubahan ini akan efektif hanya untuk saat ini proses di mana hal itu diberikan, maka akan ada perubahan nilai secara permanen. Anak proses secara otomatis akan mewarisi lingkungan dari proses induk.
untuk Mengatur Variabel:
barang metode Penugasan menggunakan kunci:
import os
os.environ['DEBUSSY'] = '1' #Environ Variable must be string not Int
untuk mendapatkan atau untuk memeriksa apakah ada atau tidak,
karena os.lingkungan adalah sebuah contoh anda bisa mencoba objek jalan.
Metode 1:
os.environ.get('DEBUSSY') # this is error free method if not will return None by default
akan mendapatkan'1'
sebagai nilai kembali
Metode 2:
os.environ['DEBUSSY'] # will throw an key error if not found!
Metode 3:
'DEBUSSY' in os.environ # will return Boolean True/False
Metode 4:
os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements
Anda dapat menggunakan os.environ
kamus untuk mengakses variabel lingkungan anda.
Sekarang, masalah saya adalah bahwa jika saya mencoba untuk menggunakan os.sistem
untuk menjalankan file batch yang set variabel lingkungan anda (menggunakan perintah SET pada a *.bat file) itu tidak akan benar-benar mengatur mereka untuk lingkungan python (tapi untuk proses anak yang dibuat dengan os.sistem
fungsi). Untuk benar-benar mendapatkan variabel-variabel yang ditetapkan di lingkungan python, saya menggunakan script ini:
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
Ketika anda bermain dengan variabel lingkungan (menambah/memodifikasi/menghapus variabel), sebuah praktek yang baik adalah untuk memulihkan keadaan sebelumnya pada fungsi penyelesaian.
Anda mungkin perlu sesuatu seperti modified_environ
konteks manager jelaskan dalam pertanyaan untuk mengembalikan variabel lingkungan.
Klasik penggunaan:
with modified_environ(DEBUSSY="1"):
call_my_function()
Perlu dicatat bahwa jika anda mencoba untuk mengatur variabel lingkungan untuk bash evaluasi ini tidak't simpan apa yang anda harapkan. Contoh:
from os import environ
environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"
Ini won't mengevaluasi hal seperti itu tidak di shell, sehingga alih-alih mendapatkan /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Isi/Home
sebagai jalan anda akan mendapatkan ekspresi literal $(/usr/libexec/java_home)
.
Pastikan untuk mengevaluasi sebelum setting variabel lingkungan, seperti:
from os import environ
from subprocess import Popen, PIPE
bash_variable = "$(/usr/libexec/java_home)"
capture = Popen("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("Error: Unable to find environment variable " + bash_variable)