2008-11-04 20 views
15

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

import os 
os.environ["FOO"] = "A_Value" 

अजगर प्रक्रिया रिटर्न, FOO, यह मानते हुए यह मूल रूप से अपरिभाषित था, अभी भी अपरिभाषित किया जाएगा। क्या इसकी मूल प्रक्रिया के माहौल को संशोधित करने के लिए अजगर प्रक्रिया (या कोई भी बाल प्रक्रिया) का कोई तरीका है?

मैं जानता हूँ कि आप आमतौर पर की तरह

source script_name.sh 

इस समस्या को कुछ का उपयोग कर हल लेकिन अन्य आवश्यकताओं के साथ इस संघर्ष मेरे पास है।

+0

इस संबंधित सवाल देखें: http://stackoverflow.com/questions/205064/is-there-a-way-to-change-another-processs-environment-variables – Davide

+0

उस धागे से एंड्रयू ने उत्तर दिया: Via gdb: (gdb) देते हैं PROCESS_ID (gdb) कॉल putenv ("env_var_name = env_var_value") (gdb) अलग यह काफी बुरा हैक है और केवल एक डिबगिंग परिदृश्य के संदर्भ में किया जाना चाहिए निश्चित रूप से । – grieve

उत्तर

14

कोई प्रक्रिया अपनी मूल प्रक्रिया (या किसी अन्य मौजूदा प्रक्रिया 'पर्यावरण को बदल सकती है)।

हालांकि, आप संशोधित वातावरण के साथ एक नया इंटरैक्टिव खोल बनाकर एक नया वातावरण बना सकते हैं।

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

आपको उपप्रोसेस का उपयोग करने की आवश्यकता है। /bin/bash -i चलाने के लिए खोलें।

तो मूल खोल पाइथन चलाता है, जो एक नया खोल चलाता है। हां, आपके पास बहुत सारी प्रक्रियाएं चल रही हैं। नहीं, यह बहुत बुरा नहीं है क्योंकि मूल खोल और पायथन वास्तव में सब कुछ खत्म नहीं कर रहे हैं, ताकि वे सबहेल खत्म हो जाएं ताकि वे साफ-सफाई से बाहर निकल सकें।

+0

हाँ, यही वह है जो मैं वर्तमान में कर रहा हूं। मैं फिर से शुरू करने के नृत्य से बचने की कोशिश कर रहा था। – grieve

+0

मैंने आपके पोस्ट को कुछ मामूली टाइपो फिक्सिंग संपादित किया, और एक संश्लेषित टिप्पणी जोड़ा (यदि आप असहमत हैं तो आप इसे हटाना चाहते हैं) – tzot

+1

"मौजूदा" प्रक्रिया को बदलना - जबकि सत्य - स्पर्शपूर्ण है। माता-पिता की प्रक्रिया को बदलना हर किसी को भ्रमित करता है; यह लोगों के लिए अस्पष्ट है कि सभी * nix आदेश एक उपप्रजाति में चल रहे हैं। –

13

किसी भी बच्चे की प्रक्रिया के लिए, माता-पिता प्रक्रिया के वातावरण को बदलने के लिए यह संभव नहीं है। सबसे अच्छा आप कर सकते हैं कि शेल स्टेटमेंट को आउटपुट करना है जिसे आप स्रोत करते हैं, या इसे उस फ़ाइल में लिखते हैं जिसे आप माता-पिता में स्रोत करते हैं।

10

मैं बैश eval कथन का उपयोग, और अजगर स्क्रिप्ट उत्पादन खोल कोड होता

child.py:

#!/usr/bin/env python 
print 'FOO="A_Value"' 

parent.sh

#!/bin/bash 
eval `./child.py`