2011-07-11 23 views
8

मैं सोच रहा हूँ क्या कारण virtualenv उसी तरह यह Lib और Scripts लोगों बनाता DLLs फ़ोल्डर बना नहीं करता है?वर्चुअलनेव DLLs फ़ोल्डर क्यों नहीं बनाता है?

सवाल मेरे पास आया जब मैं PyDev के साथ निम्न समस्या थी;
मैं एक अजगर दुभाषिया के रूप में मेरे virtualenvs में से एक की स्थापना की और सब कुछ एक अपवाद के साथ ठीक था। मैंने select मॉड्यूल से सभी आयातों के लिए अनसुलझे आयात के बारे में चेतावनियां प्राप्त की हैं। ऐसा इसलिए है क्योंकि select मॉड्यूल, अधिकांश अन्य लोगों के विपरीत, केवल डीएलएल फ़ोल्डर में मौजूद है।

उत्तर

8

मैं एक छोटे से अधिक इस विषय की जांच की। मैं techtonik के बयान से शुरू कर दिया - जवाब सरल है - कोई भी इसे लागू किया। हालांकि, यह एक और सवाल पूछता है - क्यों किसी ने इसे लागू नहीं किया? मुझे संदेह है कि जवाब इसलिए है क्योंकि यह काम करता है। इससे अभी तक एक और सवाल उठता है - यह क्यों काम करता है?

कारण सब कुछ DLLs फ़ोल्डर के बिना काम करता virtualenv में नकल की जा रही है कि

  • अजगर खोज sys.path किसी भी dll यह
  • sys.path जरूरत virtualenv के सक्रियण के बाद मूल DLLs फ़ोल्डर
के पथ को मिल रहा है

पहले बयान बससे DLLs फ़ोल्डर के लिए पथ को हटाने के द्वारा परीक्षण किया जा सकताऔर select मॉड्यूल आयात करने का प्रयास कर रहा है (इस मॉड्यूल को DLLs फ़ोल्डर से select.pyd फ़ाइल की आवश्यकता है) जो तब विफल हो जाता है।

टिप्पणी में आप कहते हैं कि मैं पाइथन कोड के साथ वर्चुअल वातावरण में पायथन मॉड्यूल के डीएलएल रखना चाहता हूं। वर्चुअलएन्व में DLLs फ़ोल्डर को कॉपी करके संभव है। वर्चुअलनव के सक्रियण के बाद sys.path वर्चुअलएन्व के अंदर DLLs फ़ोल्डर के पथ के लिए sys.path भी है (हालांकि वर्चुअलएनवी बनाते समय ऐसा कोई फ़ोल्डर नहीं बनाया जा रहा है)। यह पथ मूल DLLs फ़ोल्डर के पथ से पहले रखा गया है जिसका अर्थ है कि इसे पहले खोजा जा रहा है और इस प्रकार मूल DLLs फ़ोल्डर को ओवरराइड करता है।

मैंने पायथन की मेलिंग सूची में DLLs folder on Windows शीर्षक वाले प्रश्न पोस्ट किए।

+0

"वर्चुअलएन्व के सक्रियण के बाद sys.path में मूल DLLs फ़ोल्डर का पथ होता है" मैंने अपने env को सक्रिय नहीं किया है, और इसमें 'sys.path' में मूल DLLs फ़ोल्डर का पथ भी शामिल है। क्या मैंने आपको गलत समझा? – cubuspl42

+1

* (...) वर्चुअलएन्व के सक्रियण के बाद 'sys.path' ** ** ** वर्चुअलनव (...) के अंदर 'डीएलएलएस' फ़ोल्डर के लिए पथ भी है * वर्चुअलएन्व सक्रिय किए जाने के बिना' sys.path' में पथ * पाइथन की स्थापना से डीएलएल * फ़ोल्डर। वर्चुअलएन्व को सक्रिय करने के बाद 'sys.path' में ** ** ** ** वर्चुअलएन्व के विशिष्ट * डीएलएल * फ़ोल्डर और पाइथन की स्थापना से * डीएलएल * फ़ोल्डर में शामिल हैं। –

3

IMO उसके लिए और अधिक कारण हैं:

  • सुरक्षा: कुछ वातावरण में, नीति यादृच्छिक स्थानों से क्रियान्वित/लोड हो रहा है सामान से इनकार करने के लिए, सुरक्षा उल्लंघनों को रोकने के प्रयास में है। इस प्रकार,
  • कुछ हद तक प्रसिद्ध DLLloadorder, जो दुर्भावनापूर्ण dlls को लोड होने से रोकता है :)। कोई भी इसे लागू किया - भी here

HTH,

+0

प्रश्न विंडोज के बारे में है जहां ऐसी कोई नीति नहीं है जो किसी विशिष्ट स्थान से डीएल लोड करने से रोकती है। –

+0

भले ही कोई स्पष्ट नीति न हो, डीएलएल लोड ऑर्डर अभी भी वैध है (और आपको इसे सूची में जोड़ना होगा)। इसके अलावा, विकल्पों की भीड़ को देखते हुए, वर्चुअलनेव को कई प्रकारों से निपटने की आवश्यकता होगी, जो संभव नहीं हो सकता है। –

+0

डीएलएल लोड ऑर्डर यहां अप्रासंगिक है क्योंकि जैसा कि मैंने अपने उत्तर में लिखा है पाइथन 'sys.path' में रखे फ़ोल्डर्स में डीएलएस की खोज करता है। –

6

जवाब सरल है देखें। - जब मैं virtualenv वातावरण में pythonXX.dll कॉपी करने के लिए पैच बनाया मैं एक अलग समस्या को हल करने गया था:

जब अजगर पूरे सिस्टम पर स्थापित कर रहा है - python.exe द्विआधारी कि virtualenv को कॉपी किया है हमेशा अपने pythonXX ढूँढने में सक्षम है .dll, क्योंकि यह .dll Windows \ System32 से उपलब्ध है। यदि पाइथन केवल वर्तमान उपयोगकर्ता के लिए स्थापित है - pythonXX.dll को PythonXX dir में रखा गया है जहां मूल python.exe स्थित है। तो जिस समस्या को मैं हल कर रहा था वह वर्तमान उपयोगकर्ता के लिए स्थापित पायथन के साथ बनाए गए वर्चुअलएन्व को ठीक करना है। यह सब सामान खोदने में काफी समस्या थी।

प्रश्न पर वापस। मुझे वास्तव में पता नहीं है कि यह pythonXX.dll को इसके डीएलएल मॉड्यूल कैसे मिलते हैं - यह पाइथन डेवलपर्स के लिए एक सवाल है, लेकिन मुझे संदेह है कि यह उन्हें नहीं ढूंढता है। issue #87 को ठीक करते समय मैंने इस समस्या को ठीक नहीं किया है, इसलिए मेरा कोड शायद इस DLLs निर्देशिका से मॉड्यूल का उपयोग नहीं करता है।

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