2011-12-22 10 views
6

से ज़िप से लोड पीईडी फाइलें मैं syp.path को बढ़ाए जाने के बाद ही एक पायथन दुभाषिया से "कुछ आयात करें" पर कॉल करके एक ज़िप फ़ाइल से पाइथन मॉड्यूल (.py, .pyc, .pyd) लोड कर सकता हूं। ज़िप फ़ाइल और केवल बाद मैंएम्बेडेड पायथन

import zipextimporter 
zipextimporter.install() 

बाद समाप्त हो गया है .pyd मॉड्यूल के लिए आवश्यक है शामिल करने के लिए।

मैं सी ++ में एम्बेडेड पायथन से पाइथन .py और .pyc मॉड्यूल भी लोड कर सकता हूं। हालांकि, ताकि भी एम्बेडेड अजगर से मॉड्यूल .pyd लोड करने के लिए मैं

PyRun_SimpleString("import zipextimporter"); 

सी ++ exe रन इस लाइन से परे त्रुटि के बिना जोड़ा।

enter image description here

क्यों करता zipextimporter.install() दुर्घटना जब अजगर एम्बेडेड है: लेकिन अगले आदेश

PyRun_SimpleString("zipextimporter.install()"); 

मुझे इस त्रुटि देता है?

मैं इसे कैसे हल कर सकता हूं?

क्या इसे शायद C++ कोड संकलित करने के तरीके से करना होगा? मैं जी ++ का उपयोग करें:

g++ embed-simple.cpp -IE:\Python27\include -LE:\Python27\libs -lpython27 -o embed-simple

मुझे लगता है कि एक समाधान प्रदान कर सके एक लिंक How to link against msvcr90.dll with mingw gcc?

देखा था? यदि हां, तो मुझे इसे कैसे समायोजित करना चाहिए, gcc -> g ++, क्योंकि मैं सी ++ कोड चला रहा हूं, सी

मैं WinXP पर पायथन 2.7.2 चला रहा हूं।

मैं एक साफ के बाद रनटाइम त्रुटि नहीं मिलता है अजगर 2.7.2 के स्थापित करते हैं, तो बस इस:

Import Error: No module named....

यह तरीका embedding सी ++ स्क्रिप्ट संकलित किया गया है कोई फर्क होगा? मैंने जी ++ का इस्तेमाल किया। मैं भी इंटेल कंपाइलर के साथ संकलित, लेकिन यह एक ही रनटाइम त्रुटि दे दी। शायद मुझे एमएस विजुअल सी ++ का प्रयास करना चाहिए।

या पीडीडी आयात करने के लिए ctypes का उपयोग करें?

+0

मैंने इस पर भी ठोकर खाई है ... मैं PyCrypto आयात करने की कोशिश कर रहा हूं और जब मैं एम्बेडेड संस्करण का उपयोग करता हूं तो मुझे एक ही त्रुटि मिलती है। यह बक्षीस – Chiguireitor

उत्तर

4

पीवायडी फाइलें मूल नाम के साथ मूल डीएलएल फाइलें हैं। उन्हें लोड करना ऑपरेटिंग सिस्टम सुविधाओं और ऑपरेटिंग सिस्टम प्रतिबंधों पर निर्भर करता है।

विंडोज एक्सपी, या जहां तक ​​मुझे पता है, कोई भी ओएस ज़िप फ़ाइलों से डीएलएल फाइल लोड नहीं कर सकता है, इस प्रकार आप ज़िप फ़ाइलों से पीवायडी फाइल लोड नहीं कर सकते हैं।

+1

आपका उत्तर गलत लगता है। यह WinXP पर एक पायथन दुभाषिया से काम करता है, यह WinXP पर एम्बेडेड पायथन से नहीं है। –

+0

हम्म। मुझे तब गलत होना चाहिए :(लेकिन शायद यह मुद्दों का कारण है ... डीएलएल लोडिंग कुछ ओएस विशिष्ट नियमों का सम्मान करता है, जैसे कि एक्सईई के समान निर्देशिका से डीएलएल फाइल लोड करना। उन्हें ज़िप से लॉज नहीं किया जा सकता है, लेकिन यह सिर्फ "किसी कारण से काम करने के लिए होता है"। sys.path को संशोधित करने के बजाय os.environ ["PATH"] को संशोधित करने का प्रयास करें जो विंडोज़ को कुछ संकेत बता सकता है कि डीएलएल को लोड करने के लिए कहां से –

+0

सं। चेक किया गया है। यह केवल पायथन दुभाषिया से काम करता है ज़िप को शामिल करने के लिए sys.path को समायोजित करने के बाद। –

2

पायथन का कौन सा संस्करण memimporter.pyd (जो zipextimporter के अंदर है) के लिए संकलित किया गया था? यदि पाइथन दुभाषिया और पीईडी मेल नहीं खाते तो आपको भयानक दुर्घटनाएं मिलेंगी।

मुझे यकीन नहीं है कि मेम आयातक कोड कहां है, लेकिन अनुमान में मुझे लगता है कि विचार एक आयात हुक डालना है जो एक ज़िप-आधारित पीडीडी आयात का पता लगाता है और पीडी को अस्थायी स्थान पर कॉल करता है और कॉल करता है उस पर पाइथन दुभाषिया का मानक आयात।

+0

मुझे लगता है कि यह कोड है: http://src.chromium.org/svn/trunk/tools/third_party/python_26/Lib/site-packages/zipextimporter.py लेकिन I मुझे यकीन है कि पाइथन मेमिमपोर्टर का कौन सा संस्करण संकलित किया गया था। मुझे यह कैसे पता चलेगा? –

+0

आपने इसे कहां से डाउनलोड किया? वे आम तौर पर आपको डाउनलोड लिंक पर या उसके करीब बताते हैं। जिस लिंक पर आपने मुझे बताया है वह पाइथन 2.6 है , उदाहरण के लिए –

+0

लेकिन कोई भी "आयात _ चला सकता है किसी भी पायथन दुभाषिया से "ज्ञापन"। हालांकि, यह ज़िप के अंदर से zipextimporter.pyc ले सकता है, जो मेरे मामले में py2exe द्वारा उत्पन्न किया गया था। मैंने शुरुआत के बजाय ज़िप को अंत में रखने के लिए sys.path को समायोजित करने का प्रयास किया, यानी, PyRun_SimpleString ("sys.path.insert (-1, \"। \\ python27.zip \ ")"); PyRun_SimpleString के बजाय ("sys.path.insert (0, \"। \\ python27.zip \ ")"); लेकिन इससे कोई फर्क नहीं पड़ता। –

5

memimporter और zipextimporter वास्तव में फ़ाइलों को अनपॅक किए बिना स्मृति/ज़िप-अभिलेखागार से .pyd फ़ाइलों को लोड करने में सक्षम हैं।

रनटाइमर R6034 इस तथ्य के कारण होता है कि वीसी 9 रनटाइम लाइब्रेरी को एक मैनिफेस्ट के माध्यम से लोड किया जाना चाहिए। पाइथन 2.5 में अपना कोड चलाना, जो एक अलग सी रनटाइम का उपयोग करता है, शायद सबसे अधिक सफल होगा। मुझे लगता है कि आपको अपने एक्सई में वीसी 9 रनटाइम लाइब्रेरी का संदर्भ देने वाला एक मैनिफेस्ट एम्बेड करना होगा; शायद py2exe विकी कुछ मार्गदर्शन प्रदान कर सकते हैं।

+0

धन्यवाद। क्या इसका मतलब यह है कि अगर मैं विजुअल स्टूडियो के साथ एम्बेडिंग सी ++ कोड संकलित करता हूं, तो शायद यह काम करेगा, क्योंकि डिफ़ॉल्ट रूप से विजुअल स्टूडियो मैनिफेस्ट को एम्बेड करने का प्रयास करता है? –

+0

मुझे नहीं पता (मैं अब सी/सी ++ प्रोग्राम नहीं लिखता ;-) – theller

+0

मैं अभी भी उलझन में हूं। यदि zipextimporter.pyc ज़िप के अंदर है, _memimporter भी ज़िप के अंदर होगा। लेकिन उत्तरार्द्ध एक .pyd फ़ाइल है जिसे हम लोड नहीं कर सकते हैं, क्योंकि हम एक ऐसे टूल की खोज कर रहे हैं जो हमें ऐसा करने में सक्षम बनाता है: एक ज़िप के भीतर से pyd फ़ाइलों को लोड करना। –

2

यह उसी तरह के मुद्दों की तरह लगता है जो मैंने py2exe के साथ एक ऐप संकलित करने का प्रयास किया था। यहां देखें: http://www.py2exe.org/index.cgi/Tutorial, अनुभाग 5.2 देखें। वही बात होती है ... पहली बार जब आप memimporter का उपयोग करने का प्रयास करते हैं, तो यह एक समान त्रुटि संदेश के साथ दुर्घटनाग्रस्त हो जाता है। असल में, पायथन 2.6+ के लिए आपको पथ में रनटाइम लाइब्रेरी का सटीक संस्करण होना चाहिए, और एक मैनिफेस्ट जो इसे इंगित करता है। चूंकि आप एम्बेडेड पायथन का उपयोग कर रहे हैं, मुझे नहीं पता कि यह सब कैसे काम करता है, लेकिन शायद यह आपको करीब ले जाएगा।

मैं रनटाइम डीएल के 'सही' संस्करण को कहीं भी शुरू कर दूंगा, और आपके पाइथन कोड में, zipextimporter आयात करने से पहले, सही रनटाइम के पथ को sys.path में जोड़ दें और देखें कि यह ठीक करता है या नहीं। यह सुनिश्चित नहीं है कि आप एम्बेडेड पायथन के लिए वहां कैसे प्रकट होते हैं। इसे मूल ऐप के मैनिफेस्ट में शामिल करने की आवश्यकता हो सकती है।

संपादित करें: बीटीडब्ल्यू, मैं भूल गया, हमें इस मुद्दे के आसपास एक और तरीका भी मिला। मैं सटीक विवरण भूल जाता हूं, लेकिन क्या होता है कि आपका ऐप रनटाइम का डिफ़ॉल्ट संस्करण लोड करता है, और उसके बाद पायथन अपने संस्करण के लिए पूछता है, और इसे सी: \ python {26,27} में मिलता है और यह मेल नहीं खाता है। इस समस्या को हल करने का सबसे आसान तरीका c: \ python \ msvcr90.dll को हटाना है। फिर, पायथन डीएल के स्थानीय (पुराने) संस्करण को नहीं दबाएगा जो आपके ऐप के मैनिफेस्ट के साथ काम नहीं कर सकता है, और दोनों को बाहर जाना होगा और विंडोज़ निर्देशिका से वर्तमान संस्करण प्राप्त करना होगा, जो मेल खाएगा।

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