पायथन में पर्यावरण चर कैसे सेट करें


658

मुझे अजगर स्क्रिप्ट में कुछ पर्यावरण चर सेट करने की आवश्यकता है और मैं चाहता हूं कि अन्य सभी लिपियों को पर्यावरण चर सेट देखने के लिए अजगर से बुलाया जाए।

यदि मैं करता हूँ

os.environ["DEBUSSY"] = 1`

यह शिकायत करता है कि 1उसे स्ट्रिंग होना है।

मैं यह भी जानना चाहता हूं कि एक बार इसे सेट करने के बाद मैं अजगर (स्क्रिप्ट के बाद के हिस्से में) में पर्यावरण चर कैसे पढ़ सकता हूं।



यह भी संबंधित: youtu.be/ScyxIfOuSXs?t=61
यानिक हमन

प्रश्न से असंबंधित: मैंने उस संस्करण को पढ़ा। के रूप में नाम बिल्ली
अहमद

जवाबों:


790

पर्यावरण चर तार होना चाहिए, इसलिए उपयोग करें

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

DEBUSSYस्ट्रिंग के लिए चर सेट करने के लिए 1

इस चर को बाद में एक्सेस करने के लिए, बस उपयोग करें:

print(os.environ["DEBUSSY"])

बाल प्रक्रियाएं मूल प्रक्रिया के पर्यावरण चर को स्वचालित रूप से प्राप्त करती हैं - आपके हिस्से पर कोई विशेष कार्रवाई की आवश्यकता नहीं होती है।


20
कुछ प्लेटफार्मों पर, os.environ को संशोधित करना वास्तव में वर्तमान प्रक्रिया या बच्चे की प्रक्रियाओं के लिए सिस्टम वातावरण को संशोधित नहीं करेगा। अधिक जानकारी के लिए डॉक्स देखें: docs.python.org/2/library/os.html#os.environ
इवान

8
@ इवान यूनिक्स के कुछ ऐतिहासिक संस्करण हो सकते हैं जो समर्थन नहीं करते हैं putenv(), लेकिन उन यूनिक्स के लिए कुछ भी नहीं है जो आप वैसे भी कर सकते हैं। यहां तक ​​कि AIX और HPUX के पुराने संस्करण ने भी इसके साथ काम किया। यदि कोई वास्तव में आज समर्थन करने वाले कंप्यूटर को खोजने में सक्षम है, मुझे संदेह है कि वे उस कंप्यूटर पर पायथन को चलाने में सक्षम होंगे। :)
स्वेन मार्नाच

3
सावधानी: ऊपर दिए गए @ इवान के संदर्भ से उद्धृत करने के लिए, वातावरण में इस तरह के बदलाव os.system (), popen () या fork () और execv () के साथ शुरू हुई उपप्रकारों को प्रभावित करते हैं। दूसरे शब्दों में, ध्यान रखें कि यह तरीका आपके प्रोग्राम को चलाने के तरीके को संशोधित नहीं करेगा, केवल उसी तरह से जिससे आपके प्रोग्राम के बच्चे चलते हैं। सच है, आपका कार्यक्रम पर्यावरण चर को सेट और पढ़ सकता है, लेकिन केवल उस वातावरण से जो वह अपने बच्चों के लिए कॉन्फ़िगर करता है। यह भी देखें: मौजूदा प्रक्रिया वातावरण बदलने । अब तक मुझे पायथन स्क्रिप्ट के लिए अपने माता-पिता को संशोधित करने का कोई तरीका नहीं मिला है।
CODE-REaD

1
@SvenMarnach का कथन है "बाल प्रक्रिया स्वचालित रूप से मूल प्रक्रिया के वातावरण को '' बैश जैसे खोल के लिए सही मानती है। ''
कृष्णा ओझा

@darth_coder यह यूनिक्स जैसे ऑपरेटिंग सिस्टम की सभी प्रक्रियाओं के लिए सही है। मैं अन्य ऑपरेटिंग सिस्टम के बारे में नहीं जानता। ध्यान दें कि शेल चर पर्यावरण में संग्रहीत नहीं किए जाते हैं जब तक कि आप उन्हें निर्यात नहीं करते हैं।
स्वेन मार्नाच

114

आपको कोड मजबूती के लिए कुछ और पहलुओं पर विचार करने की आवश्यकता हो सकती है;

जब आप पूर्णांक-मूल्यवान चर को पर्यावरण चर के रूप में संग्रहीत कर रहे हों, तो प्रयास करें

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

फिर पुनर्प्राप्ति के लिए, विचार करें कि त्रुटियों से बचने के लिए, आपको प्रयास करना चाहिए

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

संभवतः '-1' को 'सेट नहीं' के लिए स्थानापन्न करें

तो, उस सब को एक साथ रखने के लिए

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
क्या आप बता सकते हैं कि लिनक्स मशीन पर चर कैसे सेट किया जाएगा, सभी प्लेटफार्मों के लिए कोड समान है?
अनुराग-शर्मा

2
यह शायद ही कभी एक लापता पूर्णांक के लिए स्टोर करने के लिए समझ में आता है। एक बेहतर शर्त यह होगी myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None- इस तरह यह कोई भी नहीं होगा यदि कोई संख्या प्रदान नहीं की गई थी
बेंजामिन एटकिन

1
यदि आप पूर्णांक के साथ काम कर रहे हैं, तो -1 एक मायने रखता है। हालाँकि, मैं संभवतः एक वैरिएबल / स्थिरांक को उस मान पर सेट करूँगा जिसका उपयोग मैं सेट नहीं करने के लिए करूँगा (जैसे, value_not_set = '-1')। तब, आप उपयोग कर सकते हैंdebussy = int(os.environ.get('DEBUSSY', value_not_set))
yeOldeDataSmythe

68

os.environएक अजगर शब्दकोश की तरह व्यवहार करता है, इसलिए सभी सामान्य शब्दकोश संचालन किया जा सकता है। अन्य उत्तरों में वर्णित getऔर setसंचालन के अलावा , हम यह भी जांच सकते हैं कि क्या कोई कुंजी मौजूद है। कुंजी और मूल्यों को तार के रूप में संग्रहीत किया जाना चाहिए ।

अजगर ३

पाइथन 3 के लिए, डिक्शनरी has_key के बजाय कीवर्ड में उपयोग करते हैं

>>> import os
>>> 'HOME' in os.environ  # Check an existing env. variable
True
...

अजगर २

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

उपयोग करने के बारे में ध्यान देने योग्य बात है os.environ:

हालाँकि, चाइल्ड प्रोसेस पेरेंट प्रोसेस से एनवायरनमेंट इनहेरिट करता है, मैं हाल ही में एक इश्यू में चला गया था और पता लगा, अगर आपके पास अन्य स्क्रिप्ट्स हैं, जो आपके पाइथन स्क्रिप्ट को चलाने के दौरान एनवायरनमेंट को अपडेट करते हैं, तो कॉलिंग os.environफिर से लेटेस्ट वैल्यू को प्रतिबिंबित नहीं करेगी

डॉक्स से उद्धरण :

यह मैपिंग पहली बार कैप्चर की गई है जब ओएस मॉड्यूल आयात किया जाता है, आमतौर पर पायथन स्टार्टअप के दौरान प्रसंस्करण स्थल के हिस्से के रूप में स्टार्टअप। इस समय के बाद बने पर्यावरण में परिवर्तन os.environ में परिलक्षित नहीं होते हैं, केवल os.environ को सीधे संशोधित करके किए गए परिवर्तनों को छोड़कर।

os.environ.data जो सभी पर्यावरण चर को संग्रहीत करता है, एक तानाशाह वस्तु है, जिसमें सभी पर्यावरण मूल्य शामिल हैं:

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

1
प्रक्रिया के निर्माण के समय एक प्रक्रिया का वातावरण चर निर्धारित किया जाता है। इसके बाद किए गए कोई भी परिवर्तन पर्यावरण चर की प्रक्रिया की अपनी प्रति को प्रभावित नहीं करेंगे। यह सभी प्रक्रियाओं के लिए सामान्य है, न कि केवल पायथन। इसके अलावा, os.environ.dataपायथन 3.2 में इसका नाम बदल दिया गया os.environ._data, अंडरस्कोर उपसर्ग दिखा रहा है कि आपको इसे सीधे नहीं पढ़ना चाहिए। फिर भी, वैसे भी os.environ._dataअद्यतन मान नहीं होंगे।
अल स्वेगार्ट

हां, मैं अब समझ गया हूं। मैं अपने शुरुआती आश्चर्य को दूसरों के साथ साझा करना चाहता था जो देख रहे हैं। 3.2 से चर नाम के लिए अद्यतन इंगित करने के लिए धन्यवाद, उत्तर को अपडेट करेगा।
सिंसारेड

21

अगर मैं os.environ ["DEBUSSY"] = 1 करता हूं, तो यह शिकायत करता है कि 1 को स्ट्रिंग होना है।

फिर करो

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

मैं यह भी जानना चाहता हूं कि एक बार मैं इसे सेट करने के बाद अजगर (स्क्रिप्ट के बाद के हिस्से में) में पर्यावरण चर कैसे पढ़ूं।

बस के os.environ["DEBUSSY"]रूप में उपयोग करें

some_value = os.environ["DEBUSSY"]

19

चर सेट करने के लिए:

कुंजी का उपयोग कर आइटम असाइनमेंट विधि:

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

पाने के लिए या जाँच करने के लिए कि उसका अस्तित्व है या नहीं,

चूंकि os.environ एक उदाहरण है जिससे आप ऑब्जेक्ट तरीके से कोशिश कर सकते हैं।

विधि 1:

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

'1'वापसी मान के रूप में मिलेगा

विधि 2:

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

विधि 3:

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

विधि 4:

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

16

आपको पर्यावरण चर के लिए स्ट्रिंग मान असाइन करना चाहिए।

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

यदि आप पर्यावरण चर को पढ़ना या प्रिंट करना चाहते हैं तो उपयोग करें

print os.environ["DEBUSSY"]

यह परिवर्तन केवल वर्तमान प्रक्रिया के लिए प्रभावी होगा जहां इसे सौंपा गया था, यह स्थायी रूप से मूल्य नहीं बदलेगा। बच्चे की प्रक्रिया स्वचालित रूप से मूल प्रक्रिया के वातावरण को विरासत में देगी।

यहाँ छवि विवरण दर्ज करें


5
"यह परिवर्तन केवल वर्तमान प्रक्रिया के लिए प्रभावी होगा जहां इसे सौंपा गया था, यह स्थायी रूप से मूल्य में कोई बदलाव नहीं करेगा।"
spitfiredd

2
यदि मैं अजगर खोल से बाहर निकलता हूं, और पहले से सेट किया गया ओएस एनसाइटम समाप्त हो गया है।
MeadowMuffins

मैं विंडोज़ में एक पर्यावरण चर कैसे सेट करूँ? मैंने कोशिश की set [<name>=[<value>]]लेकिन यह केवल वर्तमान चल रही प्रक्रिया के लिए बनाता है। जब मैं cmd ​​को बंद करता हूं तो यह मौजूद नहीं होता है और जब यह खुला होता है तो अन्य प्रोग्राम इसे नहीं देख सकते हैं।
फिलीप

15

किस बारे में os.environ["DEBUSSY"] = '1'? पर्यावरण चर हमेशा तार होते हैं।


14

मैं पर्यावरण चर जोड़ने की कोशिश कर रहा हूं। मेरा लक्ष्य कुछ उपयोगकर्ता सूचनाओं को सिस्टम चर जैसे कि मैं भविष्य के समाधान के लिए उन चर का उपयोग कर सकता हूं, को कॉन्फ़िगर करने के लिए विकल्प के रूप में संग्रहीत करना है। हालांकि, नीचे दिए गए कोड में वर्णित विधि ने मुझे बिल्कुल मदद नहीं की।

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")

यह सरल कोड ब्लॉक अच्छी तरह से काम करता है, हालांकि, ये चर संबंधित प्रक्रियाओं के अंदर मौजूद हैं जैसे कि आप उन्हें विंडोज़ सिस्टम सेटिंग्स के पर्यावरण चर टैब में नहीं पाएंगे। बहुत ऊपर के कोड ने मेरा उद्देश्य पूरा नहीं किया। इस समस्या पर यहाँ चर्चा की गई है: परिवर्तनशील बचत समस्या

os.environ.putenv(key, value)

एक और असफल प्रयास। तो, आखिरकार, मैं ओएस पैकेज के सिस्टम वर्ग के अंदर लिपटे विंडोज़ शेल कमांड की नकल करके खिड़की के वातावरण रजिस्टर के अंदर चर को सफलतापूर्वक बचाने में कामयाब रहा। निम्न कोड इस सफल प्रयास का वर्णन करता है।

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

मुझे उम्मीद है कि यह आप में से कुछ के लिए उपयोगी होगा।


12

यह ध्यान दिया जाना चाहिए कि यदि आप पर्यावरण चर को एक बैश मूल्यांकन में सेट करने का प्रयास करते हैं, तो यह वह स्टोर नहीं करेगा जो आप अपेक्षा करते हैं। उदाहरण:

from os import environ

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

यह इसका मूल्यांकन नहीं करेगा जैसे यह एक शेल में करता है, इसलिए /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Homeएक पथ के रूप में प्राप्त करने के बजाय आपको शाब्दिक अभिव्यक्ति मिलेगी $(/usr/libexec/java_home)

पर्यावरण चर को सेट करने से पहले इसका मूल्यांकन करना सुनिश्चित करें, जैसे:

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.environअपने पर्यावरण चर का उपयोग करने के लिए शब्दकोश का उपयोग कर सकते हैं ।

अब, मेरे पास एक समस्या यह है कि अगर मैंने os.systemएक बैच फ़ाइल चलाने की कोशिश की है जो आपके पर्यावरण चर को सेट करती है (एक ** बल्लेबाजी * फ़ाइल में एसईटी कमांड का उपयोग करके) तो यह वास्तव में आपके अजगर पर्यावरण के लिए उन्हें सेट नहीं करेगा (लेकिन के लिए) बच्चे की प्रक्रिया जो os.systemफ़ंक्शन के साथ बनाई गई है )। वास्तव में अजगर पर्यावरण में चर सेट करने के लिए, मैं इस स्क्रिप्ट का उपयोग करता हूं:

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

जब आप पर्यावरण चर के साथ खेलते हैं (चर जोड़ें / संशोधित करें / हटाएं), तो कार्य पूरा होने पर पिछली स्थिति को बहाल करने के लिए एक अच्छा अभ्यास है।

पर्यावरण चर को बहाल करने के लिए आपको modified_environइस प्रश्न में वर्णित संदर्भ प्रबंधक की तरह कुछ की आवश्यकता हो सकती है ।

क्लासिक उपयोग:

with modified_environ(DEBUSSY="1"):
    call_my_function()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.