2008-10-18 17 views
16

क्या पाइथन इंस्टॉलेशन में परिवर्तन किए बिना पाइथन इंस्टॉलेशन के साथ आया संस्करण के बजाय एक पाइथन मॉड्यूल को मेरी एप्लिकेशन निर्देशिका में एक डीएल लोड करने का कोई तरीका है (जिसके बाद मुझे इंस्टॉलर बनाया जाना चाहिए, और सावधान रहें मैंने पाइथन मॉड्यूल को ओवरराइट करके और डीएलएल संस्करण ग्लोबली को बदलकर लोगों के लिए अन्य ऐप्स तोड़ नहीं दिए ...)?पायथन मॉड्यूल dlls

विशेष रूप से मैं अजगर के साथ आए संस्करण के बजाय python sqlite3.dll के अपने संस्करण का उपयोग करना चाहता हूं (जो पुराना है और fts3 मॉड्यूल नहीं दिखता है)।

उत्तर

6

ठीक है यह पाइथन हमेशा टियर को पीडीडी फ़ाइल के रूप में उसी निर्देशिका में लोड करता है, चाहे पाइथन और ओएस पथ सेट किए गए हों।

इसलिए मुझे अपनी ऐप्स निर्देशिका में python/v2.5/DLLS से _sqlite3.pyd की प्रतिलिपि बनाने की आवश्यकता है जहां नया sqlite3.dll है, जो इसे पाइथन के साथ आने वाले की बजाय मेरा नया डीएल लोड करता है (क्योंकि पीईडी फाइलें पाइथनपैथ का पालन करती प्रतीत होती हैं, भले ही एक्टौल खुद को न करें)।

+0

मेरे पास एक * dll * है जो एक अलग निर्देशिका है जिसे * pyd * फ़ाइल है लोड किया गया है: यह निर्देशिका से लोड किया गया है जहां से पायथन शुरू किया गया था। (लेकिन 'os.getcwd()' कोई फर्क नहीं पड़ता।) मैं अपने * pyd * को लोड करने के लिए 'sys.path' mod कर सकता हूं * लेकिन मुझे डीआईआर से पाइथन शुरू करना है जहां * डीएल * है। * Pyd * फिर * dll * लोड करता है यह सिर्फ काम करता है। – n611x007

0

यदि एसक्लाइट का आपका संस्करण sys.path में से पहले सिस्टम संस्करण का उपयोग करेगा। तो आप इसे या तो वर्तमान निर्देशिका में डाल सकते हैं या ऐसा करने के लिए PYTHONPATH पर्यावरण चर बदल सकते हैं।

+0

मैंने अपने ऐप्स डीआईआर में डीएल डाल दिया, जिसे पायथन इंस्टॉल डीआईआर पर ईमानदारी लेनी चाहिए, लेकिन sqlite3 मॉड्यूल अभी भी मेरे बजाय पाइथन इंस्टॉल डीआईआर में डीएलएल का उपयोग करता है। क्या कोई अलग डीएलएल पथ या कुछ है? –

+0

क्या आपने केवल डीएल को उस डीआईआर में रखा था या आपने उसमें पाइथन रैपर कोड भी जोड़ा था? यदि नहीं, तो बाद वाले को आजमाएं। –

22

यदि आप पाइथन मॉड्यूल डीएलएल के बारे में बात कर रहे हैं, तो बस sys.path को संशोधित करना ठीक होना चाहिए। हालांकि, यदि आप उन DLLs के विरुद्ध DLLs से जुड़े हुए हैं; यानी libfoo.dll जो foo.pyd पर निर्भर करता है, तो आपको अपने पाथ पर्यावरण चर को संशोधित करने की आवश्यकता है। मैं doing this for PyGTK a while ago के बारे में लिखा था, लेकिन आपके मामले में मुझे लगता है कि यह उतना ही आसान के रूप में किया जाना चाहिए:

import os 
os.environ['PATH'] = 'my-app-dir' + ';' + os.environ['PATH'] 

कि आपके Windows पथ है, जो मेरा मानना ​​है कि यह भी DLLs के लिए लोड क्रम को नियंत्रित करता है के सिर पर my-app-dir डाल देंगे।

ध्यान रखें कि आपको डीएलएल को प्रश्न में लोड करने से पहले ऐसा करने की आवश्यकता होगी, यानी, कुछ भी दिलचस्प आयात करने से पहले।

sqlite3 एक विशेष मामला हो सकता है, हालांकि, इसे पायथन के साथ वितरित किया जाता है; यह स्पष्ट रूप से परीक्षण करने के लिए मुश्किल है, इसलिए मैंने sqlite3.dll विशेष रूप से चेक नहीं किया है।

+0

अभी भी नया डीएल लोड नहीं करता है ... –

+0

पहली निर्देशिका खोजी गई (% PATH% से पहले) निर्देशिका में कॉलिंग प्रक्रिया बनाने के लिए उपयोग की गई छवि फ़ाइल वाली निर्देशिका है, लोडलोडरी फ़ंक्शन के लिए एमएसडीएन देखें, हालांकि इसे बदला जा सकता है । वैसे, आप .dll फ़ाइलों पर चर्चा कर रहे हैं, लेकिन .pyd को मत भूलना। – cdarke

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