Python'da ortam değişkenleri nasıl ayarlanır


658

Python komut dosyasında bazı ortam değişkenleri ayarlamak gerekiyor ve ben ortam değişkenleri kümesini görmek için python denilen diğer tüm komut dosyaları istiyorum.

Eğer yaparsam

os.environ["DEBUSSY"] = 1`

1dize olması gerektiğini söyler .

Ayrıca bir kez ben ayarladıktan sonra python (komut dosyasının sonraki bölümünde) ortam değişkenleri okumayı bilmek istiyorum.




Soru ile ilgisiz: Ben bu var okudum. olarak isim Cat
ahmed

Yanıtlar:


790

Ortam değişkenleri dize olmalıdır, bu nedenle

os.environ["DEBUSSY"] = "1"

değişkeni DEBUSSYdizeye ayarlamak için 1.

Bu değişkene daha sonra erişmek için şunu kullanın:

print(os.environ["DEBUSSY"])

Alt işlemler, üst sürecin ortam değişkenlerini otomatik olarak devralır - sizin tarafınızdan herhangi bir özel işlem yapılması gerekmez.


20
Bazı platformlarda, os.environ üzerinde değişiklik yapmak, mevcut işlem veya alt işlemler için sistem ortamını gerçekten değiştirmez. Daha fazla bilgi için belgelere bakın: docs.python.org/2/library/os.html#os.environ
Evan

8
@Evan Unix'in desteklemediği bazı tarihsel varyantları olabilir putenv(), ancak bu Unixen için yine de yapabileceğiniz hiçbir şey yoktur. Çalıştığım AIX ve HPUX'un eski sürümü bile bunu destekledi. Eğer kimse bugün onu desteklemeyen bir bilgisayar bulabilirse, o bilgisayarda Python'u çalıştırabileceklerinden şüphelerim var. :)
Sven Marnach

3
Dikkat: @ Evan'ın yukarıdaki referansından alıntı yapmak için, Ortamdaki bu tür değişiklikler os.system (), popen () veya fork () ve execv () ile başlayan alt işlemleri etkiler. Başka bir deyişle, bu yaklaşımın programınızın çalışma şeklini değil, yalnızca programınızın çocuklarının çalışma biçimini değiştirmeyeceğini unutmayın. Doğru, programınız ortam değişkenlerini ayarlayabilir ve geri okuyabilir, ancak yalnızca çocukları için yapılandırdığı ortamdan okuyabilir. Ayrıca bkz: geçerli işlem ortamını değiştirme . Şimdiye kadar bir Python betiğinin ana env'sini değiştirmesinin bir yolunu bulamadım.
KOD-READ

1
@SvenMarnach "çocuk süreci otomatik olarak üst süreç ortamını miras gibi kabuk için doğru devralır."
Krishna Oza

@darth_coder Unix benzeri işletim sistemlerindeki tüm işlemler için geçerlidir. Diğer işletim sistemini bilmiyorum. Kabuk değişkenlerini dışa aktarmadığınız sürece çevrede depolanmadığını unutmayın.
Sven Marnach

114

Kod sağlamlığı için başka yönleri de dikkate almanız gerekebilir;

tamsayı değerli bir değişkeni ortam değişkeni olarak depolarken,

os.environ['DEBUSSY'] = str(myintvariable)

sonra almak için, hataları önlemek için denemek gerekir düşünün

os.environ.get('DEBUSSY', 'Not Set')

muhtemelen 'Not Set' yerine '-1' yerine

yani hepsini bir araya getirmek

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)

3
Değişkenin bir Linux makinesinde nasıl ayarlanacağını söyleyebilir misiniz, kod tüm platformlar için aynı mı?
Anurag-Sharma

2
Eksik bir tamsayı için -1'i depolamak nadiren mantıklıdır. Daha iyi bir bahis olurdu myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None- hiçbir sayı verilmemiş olsaydı Yok olurdu
Benjamin Atkin

1
Tamsayılarla uğraşıyorsanız, -1 bir anlam ifade eder. Ben büyük olasılıkla ben set için kullanacağım değere bir değişken / sabit ayarlamak istiyorsunuz (örn value_not_set = '-1'.). Daha sonradebussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe

68

os.environbir python sözlüğü gibi davranır, böylece tüm ortak sözlük işlemleri yapılabilir. Diğer cevaplarda belirtilen getve setişlemlerine ek olarak, bir anahtarın var olup olmadığını da kontrol edebiliriz. Anahtarlar ve değerler dize olarak saklanmalıdır .

Python 3

Python 3 için sözlükler has_key yerine in anahtar sözcüğünü kullanır

>>> 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'

Kullanmayla ilgili dikkat edilmesi gereken önemli bir nokta vardır os.environ:

Alt süreçler ortamı üst süreçten devralmasına rağmen, son zamanlarda bir sorunla karşılaştım ve anladım, eğer python komut dosyanız çalışırken ortamı güncelleyen başka komut dosyalarınız varsa, os.environtekrar çağırmak en son değerleri yansıtmayacaktır .

Dokümanlardan alıntı :

Bu eşleme, os modülü ilk kez içe aktarıldığında, genellikle Python başlatılırken işleme sitesi.py'nin bir parçası olarak yakalanır. Bu süreden sonra yapılan ortamda yapılan değişiklikler, doğrudan os.environ'ta değişiklik yapılarak yapılan değişiklikler hariç, os.environ'a yansıtılmaz.

os.environ.data tüm ortam değişkenlerini depolayan, tüm ortam değerlerini içeren bir dikte nesnesidir:

>>> type(os.environ.data)  # changed to _data since v3.2 (refer comment below)
<type 'dict'>

1
Bir işlemin ortam değişkenleri, işlem oluşturulduğunda ayarlanır. Bundan sonra yapılan değişiklikler, işlemin ortam değişkeninin kendi kopyasını etkilemez. Bu sadece Python için değil, tüm süreçler için ortaktır. Ayrıca, doğrudan okumamanız gerektiğini gösteren alt çizgi öneki os.environ.dataPython 3.2 olarak yeniden adlandırıldı os.environ._data. Neyse, os.environ._datayine de güncellenmiş değerler olmayacak.
Al Sweigart

Evet, şimdi anlıyorum. İlk sürprizimi bakan diğer insanlarla paylaşmak istedim. 3.2'den beri değişken adına yapılan güncellemeye dikkat çektiğiniz için teşekkür ederiz, yanıtı güncelleyeceğiz.
Eylül'de sisanared

21

Eğer os.environ ["DEBUSSY"] = 1 yaparsam, 1'in dize olması gerektiğini söyler.

Sonra yap

os.environ["DEBUSSY"] = "1"

Ayrıca bir kez ben ayarladıktan sonra python (komut dosyasının sonraki bölümünde) ortam değişkenleri okumak bilmek istiyorum.

Sadece os.environ["DEBUSSY"]olduğu gibi kullanın

some_value = os.environ["DEBUSSY"]

19

Değişkeni Ayarlamak için:

item Anahtar kullanarak atama yöntemi:

import os    
os.environ['DEBUSSY'] = '1'  #Environ Variable must be string not Int

var olup olmadığını kontrol etmek,

çünkü os.environ bir örneğidir nesne yolu deneyebilirsiniz.

Yöntem 1:

os.environ.get('DEBUSSY') # this is error free method if not will return None by default

'1'dönüş değeri olarak alacak

Yöntem 2:

os.environ['DEBUSSY'] # will throw an key error if not found!

Yöntem 3:

'DEBUSSY' in os.environ  # will return Boolean True/False

Yöntem 4:

os.environ.has_key('DEBUSSY') #last 2 methods are Boolean Return so can use for conditional statements

16

Ortam değişkenine dize değeri atamalısınız.

os.environ["DEBUSSY"] = "1"

Ortam değişkenini okumak veya yazdırmak istiyorsanız şunu kullanın:

print os.environ["DEBUSSY"]

Bu değişiklikler yalnızca atandığı geçerli işlem için geçerli olacaktır, değeri kalıcı olarak değiştirmeyecektir. Alt süreçler, üst sürecin ortamını otomatik olarak devralır.

resim açıklamasını buraya girin


5
"Bu değişiklikler sadece atandığı geçerli süreç için geçerli olacak, değeri kalıcı olarak değiştirmeyecek."
spitfiredd

2
Python kabuğundan çıkarsam ve daha önce ayarlanan işletim sistemi ortamı gitmişse.
MeadowMuffins

Windows'da ortam değişkenini nasıl ayarlarım? Denedim set [<name>=[<value>]]ama sadece mevcut çalışan işlem için yapar. Cmd'yi kapattığımda mevcut değil ve açıkken bile diğer programlar göremiyor.
Filip

15

Ne olmuş os.environ["DEBUSSY"] = '1'? Ortam değişkenleri her zaman dizgidir.


14

Ortam değişkenleri eklemeye çalışıyorum. Amacım, bazı değişkenleri yapılandırma değişkenlerine alternatif olarak gelecekteki çözümler için kullanabileceğim şekilde sistem değişkenlerine depolamaktı. Ancak, aşağıdaki kodda açıklanan yöntem bana hiç yardımcı olmadı.

import os
os.environ["variable_1"] = "value_1"
os.environ["variable_2"] = "value_2"
# To Verify above code
os.environ.get("variable_1")
os.environ.get("variable_2")

Bu basit kod bloğu iyi çalışır, ancak bu değişkenler, ilgili işlemler içinde Windows sistem ayarlarının ortam değişkenleri sekmesinde bulamayacağınız şekilde bulunur. Hemen hemen yukarıdaki kod amacım hizmet etmedi. Bu sorun burada tartışılmıştır: değişken kayıt sorunu

os.environ.putenv(key, value)

Başka bir başarısız girişim. Bu nedenle, son olarak, os paketinin sistem sınıfının içine sarılmış windows kabuk komutlarını taklit ederek değişkenin pencere ortamı kaydının içine başarıyla kaydetmeyi başardım. Aşağıdaki kod, bu başarılı girişimi açıklar.

os.system("SETX {0} {1} /M".format(key, value))

Umarım bu bazılarınız için faydalı olacaktır.


12

Bir bash değerlendirmesine ortam değişkeni ayarlamak için deneyin eğer unutulmamalıdır olmaz beklediğiniz saklayın. Misal:

from os import environ

environ["JAVA_HOME"] = "$(/usr/libexec/java_home)"

Bu, onu bir kabukta olduğu gibi değerlendirmez, bu nedenle /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeyol olarak almak yerine gerçek ifadeyi alırsınız $(/usr/libexec/java_home).

Ortam değişkenini aşağıdaki gibi ayarlamadan önce değerlendirdiğinizden emin olun:

from os import environ
from subprocess import Popen, PIPE

bash_variable = "$(/usr/libexec/java_home)"
capture = Popen(f"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(f"Error: Unable to find environment variable {bash_variable}")

11

os.environOrtam değişkenlerinize erişmek için sözlüğü kullanabilirsiniz .

Şimdi, yaşadığım bir sorun os.system, ortam değişkenlerinizi (bir **. Bat * dosyasındaki SET komutunu kullanarak) ayarlayan bir toplu iş dosyasını çalıştırmak için kullanmaya çalışırsam, onları gerçekten python ortamınız için ayarlamaz (ancak os.systemişleviyle oluşturulan alt işlem ). Aslında python ortamında ayarlanan değişkenleri almak için bu komut dosyasını kullanın:

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

9

Ortam değişkenleriyle oynadığınızda (değişken ekleme / değiştirme / kaldırma), işlev tamamlandığında önceki durumu geri yüklemektir.

Ortam değişkenlerini geri yüklemek için modified_environbu soruda bağlam yöneticisi gibi bir şeye ihtiyacınız olabilir .

Klasik kullanım:

with modified_environ(DEBUSSY="1"):
    call_my_function()
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.