2009-07-24 11 views
20

क्या वर्तमान प्रक्रिया के पर्यावरण चर बदलना संभव है?वर्तमान प्रक्रिया पर्यावरण बदलें LD_LIBRARY_PATH

अधिक विशेष रूप से एक अजगर स्क्रिप्ट में मैं एक मॉड्यूल 'एक्स' जो कुछ xyz.so पर निर्भर करता है के आयात पर इतना है कि LD_LIBRARY_PATH बदलना चाहते हैं, xyz.so LD_LIBRARY_PATH में मेरी दिए गए पथ से लिया जाता है

वहाँ करने के लिए किसी अन्य तरीके से है लाइब्रेरी लोड होने से पथ को गतिशील रूप से बदलें?

संपादित: मुझे लगता है मुझे लगता है कि मैं पहले से ही os.environ की तरह बात की कोशिश की है उल्लेख करने की जरूरत है [ "LD_LIBRARY_PATH"] os.putenv ('LD_LIBRARY_PATH', mypath)

= mypath लेकिन इन संशोधित env। पैदा की उप-प्रक्रिया, नहीं वर्तमान प्रक्रिया, और मॉड्यूल लोड करने के लिए नई LD_LIBRARY_PATH

EDIT2 पर विचार नहीं करता है, तो सवाल तो पुस्तकालय लोडर यह और लोड वहाँ से देखता है हम पर्यावरण या कुछ बदल सकता है?

+0

http://stackoverflow.com/questions/856116/changing-ldlibrarypath-at-runtime के इस एक नकली नहीं है -किसी-ctypes? आप वास्तव में पर्यावरण को बदलने के तरीके से नहीं पूछ रहे हैं, बल्कि पाइथन को पुस्तकालयों को लोड करने के तरीके को बदलने के बजाय। –

+0

ठीक है! मैं कहूंगा कि यह डुप्लिकेट है, लेकिन यह पर्यावरण को बदलने के बारे में नहीं है, उदाहरण के लिए। एसी ऐप में जो एक गतिशील lib ए लोड करता है, क्या हम वातावरण बदल सकते हैं ताकि ए को हमारे पसंद के रास्ते से लोड किया जा सके –

उत्तर

32

कारण

os.environ["LD_LIBRARY_PATH"] = ... 

काम नहीं करता है सरल है: इस माहौल गतिशील लोडर (ld-linux.so.2 लिनक्स पर, ld.so.1 पर सोलारिस) की चर नियंत्रण व्यवहार, लेकिन लोडर केवल एक बार प्रक्रिया स्टार्टअप पर LD_LIBRARY_PATH पर लग रहा है । के बाद के के बाद LD_LIBRARY_PATH का मान बदलना उस बिंदु पर कोई प्रभाव नहीं पड़ता है (जैसे this प्रश्न का उत्तर कहता है)।

आप कुछ विकल्प है:

ए आप जानते हैं कि आप /some/path से xyz.so की जरूरत है, और शुरू से ही अजगर स्क्रिप्ट के निष्पादन को नियंत्रित करने के लिए जा रहे हैं, तो बस अपने पसंद के हिसाब से LD_LIBRARY_PATH (सेट करने के बाद यह जांचना कि यह पहले से सेट नहीं है), और स्वयं को फिर से निष्पादित करें। यह Java करता है।

B. आप अपने निरपेक्ष पथ के माध्यम से /some/path/xyz.so आयात कर सकते हैं इससे पहले कि आयात करने x.so। जब आप x.so आयात करते हैं, तो लोडर यह पता लगाएगा कि यह पहले से ही xyz.so लोड कर चुका है, और इसके लिए पहले से लोड किए गए मॉड्यूल का उपयोग फिर से करने के बजाय करेगा।

सी आप अपने आप को x.so निर्माण हैं, तो आप -Wl,-rpath=/some/path अपने लिंक लाइन को जोड़ सकते हैं, और फिर आयात करने x.so लोडर /some/path में निर्भर मॉड्यूल देखने के लिए कारण होगा।

+0

बी, एक विकल्प की तरह दिखता है जिसे मैं –

+0

का उपयोग कर सकता हूं विकल्प बी को कैसे कार्यान्वित किया जाएगा? मुझे लगता है कि ओपी ने बताया कि '/ some/path/xyz.so' एक साझा लाइब्रेरी है कि एक पायथन मॉड्यूल पर निर्भर करता है; 'xyz.so' में पाइथन मॉड्यूल स्वयं नहीं है। मेरे पास एक समान स्थिति है और जिस तरह से आप वर्णन करते हैं उसमें पुस्तकालय आयात करने के किसी भी तरीके से नहीं जानते हैं। –

+2

@ जेसनआर विकल्प बी 'आयात डीएल का उपयोग करके लागू किया जा सकता है; dl.open ("/ कुछ/पथ/xyz.so") ' –

-4

अच्छी तरह से, वातावरण चर शब्दकोश os.environ में जमा हो जाती है, तो आप बदलना चाहते हैं, तो आप जिस तरह से लोडर एक चल अजगर के लिए काम करता है बदलने का प्रयास कर

os.environ["PATH"] = "/usr/bin" 
+0

और मुझे लगता है कि आपको यह सुनिश्चित करना होगा कि आप os.environ ["LD_LIBRARY_PATH"] * को आयात विवरण के पहले सेट करें मॉड्यूल एक्स। – ThomasH

+0

संपादन देखें, मैंने पहले से ही यह कोशिश की है और यह –

+0

काम नहीं करता है इस तरह के फैशन में LD_LIBRARY_PATH सेट करना वर्तमान प्रक्रिया को प्रभावित नहीं करता है, जैसा कि मैंने अपने उत्तर में बताया है। –

0

कर सकते हैं मेरे अनुभव में बहुत मुश्किल है; शायद ओएस/संस्करण निर्भर; काम नहीं कर सकता एक परिस्थिति जो कुछ परिस्थितियों में मदद कर सकती है वह उप-प्रक्रिया लॉन्च करना है जो शेल स्क्रिप्ट का उपयोग करके पर्यावरण पैरामीटर को बदलती है और फिर खोल का उपयोग करके एक नया पायथन लॉन्च करती है।

8

कार्यरत रूस से जवाब के आधार पर, यह है कि क्या मेरे लिए काम करता है

oracle_libs = os.environ['ORACLE_HOME']+"/lib/" 
rerun = True 

if not 'LD_LIBRARY_PATH' in os.environ: 
    os.environ['LD_LIBRARY_PATH'] = ":"+oracle_libs 
elif not oracle_libs in os.environ.get('LD_LIBRARY_PATH'): 
    os.environ['LD_LIBRARY_PATH'] += ":"+oracle_libs 
else: 
    rerun = False 

if rerun: 
    os.execve(os.path.realpath(__file__), sys.argv, os.environ) 
+1

निष्पादित चाल * बिल्कुल * जो मुझे चाहिए, और यह काम करता है, एक उथल-पुथल है! –

संबंधित मुद्दे