2016-03-26 5 views
7

मेरे पास डिफ़ॉल्ट मानों के साथ os.environ का कॉन्फ़िगरेशन है (जो मेरी आवश्यकताओं का 9 0% कवर करता है)। मेरे पास एक विशेष एप्लिकेशन-फ्रेमवर्क-पैकेज है, उदाहरण के लिए SALOME कहा जाता है, जो सिस्टम वातावरण में पैकेज स्थापना प्रदान नहीं करता है और स्वयं निहित होने का प्रयास करता है, इसके लिए विशेष पुराने प्रौद्योगिकियों का उपयोग करने की भी आवश्यकता होती है जो पर्यावरण चर पर भरोसा करते हैं sys.path और PYTHONPATH नहीं हैं केवल एक चीज की जरूरत है। जब मैं इसे बनाने वाले वातावरण के अंदर os.environ पर कॉल करना शुरू कर देता हूं तो मुझे सभी चरों की आवश्यकता होती है। मैं उस os.environ शब्दकोश को क्रमबद्ध कर सकता हूं।पायथन में os.en वातावरण कैसे शामिल करें?

मुझे आश्चर्य है कि os.environ का विलय कैसे लागू करें मेरे पास वर्तमान में चल रहे सिस्टम पर है जिसे मैंने धारावाहिक द्वारा प्राप्त किया है?

import json 
import os 

with open('environ.json', 'w') as f: 
    json.dump(dict(**os.environ), f) 

अब आप उन इस तरह वापस पढ़ सकते हैं (अन्य प्रोग्राम में)

import json 
import os 

with open('environ.json', 'r') as f: 
    os.environ.update(json.load(f)) 

यह केवल जोड़ देगा या:

+2

आपका मतलब है 'os.en वातावरण.update (deserialized_environment) '? – mgilson

+0

@mqilson: हाँ ऐसा कुछ। कोई निष्कासन नहीं - केवल सम्मिलन और जोड़। – DuckQueen

+1

@ डककुएन और क्यों वास्तव में मैगिलसन का समाधान आपके लिए काम नहीं करता है? 'os.environ' एक ताना है, एक और वस्तु dict है, और' dict.update' जैसा आपने समझाया है, वैसे ही काम करेगा - डेटा अपडेट को 'अपडेट()' तर्क से डेटा द्वारा ओवरराइट किया जाएगा। गैर-विरोधाभासी कुंजी बरकरार रहेंगी। –

उत्तर

5

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

आप उन्हें जोड़कर केवल विशिष्ट चरों अपडेट करना चाहते हैं (अतिरिक्त पथ जोड़ने के लिए उदाहरण के लिए तो), तो आप स्पष्ट रूप से कर सकते हैं:

with open('environ.json', 'r') as f: 
    loadedenv = json.load(f) 

pathvars = ['PATH', 'PYTHONPATH'] 

for p in pathvars: 
    os.environ[p] += ':' + loadedenv[p] 
+0

क्या यह पहले से मौजूद मौजूदा स्ट्रिंग्स (जैसे पथ) को जोड़ या प्रतिस्थापित करेगा? – DuckQueen

+0

यह मौजूदा मानों को नए लोगों के साथ बदल देगा। – chthonicdaemon

+0

@DuckQueen पथों को मर्ज करने के लिए, आपको इस बारे में सोचना होगा कि लोड किए गए मानों को मौजूदा मानों के पहले या बाद में जोड़ा जाना चाहिए, क्या विलय प्रक्रिया होनी चाहिए? मैंने एक विधि जोड़ दी है जो 'नए' मानकों को ':' विभाजक के साथ अंत में जोड़ती है। – chthonicdaemon

1

आप एक शब्दकोश के लिए एक से अधिक मान चाहते हैं जो मानक अजगर शब्दकोश की तुलना में आप

werkzeug.datastructures.MultiDict 
os.environ = MultiDict([('Key1', 'First Value'), ('Key1', 'Second Value')]) 

अद्यतन का उपयोग कर सकते भी उसी तरह के रूप में मैं नीचे उल्लेख किया है काम करेंगे प्रदान नहीं करता है।

यदि आप नए शब्दकोश के साथ विलय करने से पहले पुराने कुंजी मानों को संरक्षित नहीं करना चाहते हैं तो आप निम्न कार्य कर सकते हैं।

चूंकि os.en वातावरण एक शब्दकोश है जो आपके पास पहले से ही स्मृति में है, अन्य नियम है जिसे आप पढ़ रहे हैं उसे जेसन में परिवर्तित करने की आवश्यकता होगी। मैं आम तौर पर यूजसन का उपयोग करता हूं क्योंकि यह वास्तव में तेज़ है।

os.environ.update(new_dict) 

यदि आप जेसन को सहेजना चाहते हैं तो आप इसे फ़ाइल में डंप कर सकते हैं।

import ujson 

with open('data.json', 'w') as file: 
    ujson.dump(dict(**os.environ), file) 

यदि आप फ़ाइल को पढ़ना चाहते हैं और os.en वातावरण शब्दकोश का उपयोग कर सकते हैं तो आप इसका उपयोग कर सकते हैं।

with open('environ.json', 'r') as f: 
    os.environ.update(ujson.load(f)) 
+0

के रूप में स्वीकार किया जाना चाहिए इस तरह से 'os.en वातावरण' सेट करना काम नहीं करता है, क्योंकि 'os.environ'' केवल "एक शब्दकोश नहीं है - इसमें विधियां हैं जो वास्तव में प्रक्रिया के बच्चों के लिए पर्यावरण चर सेट करती हैं । 'Os.system (echo $ key1) का उपयोग करके परीक्षण करें और आप देखेंगे कि यह सेट नहीं है। – chthonicdaemon

3

आप शब्दकोश os.environ निर्यात लक्ष्य को हासिल करने पैकेज environs उपयोग कर सकते हैं। इसमें पर्यावरण चर आयात करने के निर्यात के लिए इनबिल्ट डम्पर/लोडर है।

from environs import Env 

env = Env() 
# reading an environment variable 
gh_user = env('GITHUB_USER') # => 'sloria' 
secret = env('SECRET') # => raises error if not set 

# casting 
api_key = env.str('API_KEY') # => '123abc' 
date = env.date('SHIP_DATE') # => datetime.date(1984, 6, 25) 

# serialize to a dictionary of simple types (numbers and strings) 
env.dump() 
# { 'API_KEY': '123abc', 
# 'GITHUB_USER': 'sloria',  
# 'SECRET': 'AASJI93WSJD93DWW3X0912NS2', 
# 'SHIP_DATE': '1984-06-25'}} 
संबंधित मुद्दे