2009-09-07 7 views
16

मैं विंडोज़ पर विकास कर रहा हूं, और मैंने इस तरह की चीज़ों के बारे में किसी को भी बात किए बिना हर जगह खोजा है।सी ++ पायथन एम्बेडिंग के साथ: यदि पाइथन स्थापित नहीं है तो क्रैश

मैंने अपने डेस्कटॉप पर एक सी ++ ऐप बनाया है जो एमएसवीसी का उपयोग कर पाइथन 3.1 एम्बेडेड है। मैंने python31.lib को लिंक किया और निष्पादन योग्य के साथ ऐप के रन फ़ोल्डर में python31.dll शामिल किया। यह बहुत अच्छा काम करता है। मेरा एक्सटेंशन और एम्बेडिंग कोड निश्चित रूप से काम करता है और कोई क्रैश नहीं होता है।

मैंने अपने दोस्त को रन फ़ोल्डर भेजा है जिसमें पाइथन स्थापित नहीं है, और ऐप स्क्रिप्टिंग सेटअप चरण के दौरान उसके लिए क्रैश हो जाता है।

कुछ घंटों पहले, मैंने अपने लैपटॉप पर ऐप की कोशिश की जिसमें पाइथन 2.6 स्थापित है। मुझे अपने दोस्त के समान दुर्घटना व्यवहार मिला, और डिबगिंग के माध्यम से पाया कि यह Py_Initialize() कॉल विफल रहता है।

मैंने ऐप कोड को बदले बिना अपने लैपटॉप पर पायथन 3.1 स्थापित किया। मैंने इसे चलाया और यह पूरी तरह से चलाता है। मैंने पायथन 3.1 को अनइंस्टॉल किया और ऐप फिर से दुर्घटनाग्रस्त हो गया। मैंने अपने ऐप में कोड को स्थानीय python31.dll से डायनामिक रूप से लिंक करने के लिए रखा है, यह सुनिश्चित करने के लिए कि यह इसका उपयोग कर रहा था, लेकिन मुझे अभी भी क्रैश हो रहा है।

मुझे नहीं पता कि दुभाषिया को शुरू करने के लिए डीएलएल से अधिक की आवश्यकता है या क्या। मैं इस पर कोई संसाधन नहीं ढूंढ पाया है। पाइथन दस्तावेज और अन्य मार्गदर्शिकाएं कभी भी आपके सी/सी ++ अनुप्रयोगों को वितरित करने का तरीका नहीं लगती हैं जो उपयोगकर्ताओं को पाइथन को स्थानीय रूप से इंस्टॉल किए बिना पाइथन एम्बेडिंग का उपयोग करती हैं। मुझे पता है कि यह यूनिक्स की तुलना में विंडोज पर एक मुद्दा है, लेकिन मैंने कई विंडोज सी/सी ++ अनुप्रयोगों को देखा है जो स्थानीय रूप से पायथन को एम्बेड करते हैं और मुझे यकीन नहीं है कि वे इसे कैसे करते हैं।

मुझे डीएलएल के अलावा और क्या चाहिए? जब मैं पाइथन स्थापित करता हूं तो यह क्यों काम करता है और फिर जब मैं इसे अनइंस्टॉल करता हूं तो काम करना बंद कर देता है? ऐसा लगता है कि यह इतना छोटा होना चाहिए; शायद यही कारण है कि कोई भी वास्तव में इसके बारे में बात नहीं करता है। फिर भी, मैं वास्तव में यह नहीं बता सकता कि इस दुर्घटना के मुद्दे से कैसे निपटें।

अग्रिम में बहुत बहुत धन्यवाद।

+1

क्या आपकी लोड लाइब्रेरी कॉल सफल होती है? आप डीएल कहां डाल रहे हैं? यह उतना ही आसान हो सकता है जितना एप्लिकेशन लाइब्रेरी नहीं ढूंढ पा रहा है। – patros

+1

LoadLibrary सफल हुआ, जैसा कि GetProcAddress था। चूंकि मुझे एक ही अपवाद मिला है क्योंकि मैंने गतिशील लिंक के बिना किया है (एक पूर्ण पहुंच उल्लंघन के बजाय) मुझे विश्वास है कि Py_Initialize को बुलाया गया था। डीएलएल रन निर्देशिका में है। मेरी रन निर्देशिका में शामिल हैं:। \ Ss_server.exe,। \ Python31.dll,। \ Admin.sqlite,। \ Settings.py,। \ Err.txt – apostrophest

उत्तर

20

pythonxy.dll के अलावा, आपको पूरी पायथन लाइब्रेरी की आवश्यकता है, यानी lib फ़ोल्डर की सामग्री, साथ ही विस्तार मॉड्यूल, यानी DLLs फ़ोल्डर की सामग्री। मानक लाइब्रेरी के बिना, पायथन भी शुरू नहीं होगा, क्योंकि यह os.py (3.x में; string.py 2.x में) खोजने का प्रयास करता है। स्टार्टअप पर, यह विशेष रूप से site.py में कई मॉड्यूल आयात करता है।

ऐसे कई स्थान हैं जहां यह मानक पुस्तकालय की खोज करता है; आपके मामलों में, अंत में यह रजिस्ट्री में पाता है। इससे पहले, निष्पादन योग्य नाम का उपयोग करता है (जैसा कि Py_SetProgramName के माध्यम से सेट किया गया है) लैंडमार्क खोजने की कोशिश कर रहा है; यह एक फ़ाइल python31.zip के लिए भी जांचता है जो मानक पुस्तकालय की एक ज़िपित प्रति होना चाहिए। यह पर्यावरण परिवर्तनीय पायथनहोम के लिए भी जांच करता है।

आप पुस्तकालय को उन सामानों से अलग करने के लिए स्वतंत्र हैं जिन्हें आपको आवश्यकता नहीं है; ऐसे कई उपकरण हैं जो निर्भरता की गणना स्थिर रूप से (विशेष रूप से मॉड्यूलफ़िंडर) करते हैं।

आप फ़ाइलों की संख्या को कम करना चाहते हैं, तो आप

  1. स्थिर आपके आवेदन
  2. में अपने pythonxy.dll, या यहाँ तक लिंक pythonxy.dll में लिंक सभी विस्तार मॉड्यूल स्थिर फ्रीज उपकरण का उपयोग कर सकते हैं ; यह मानक लाइब्रेरी के बाइट कोड को आपके pythonxy.dll में जोड़ने की अनुमति देगा।
  3. (वैकल्पिक रूप से 2.) मानक पुस्तकालय के लिए pythonxy.zip का उपयोग करें।
+0

धन्यवाद, मार्टिन। आपकी व्याख्या कुछ अंतराल में भर जाती है जिसे मैं उत्तर खोजने के दौरान भर नहीं सकता था। मैं आपके कुछ प्रस्तावित समाधानों की जांच करूंगा। – apostrophest

+1

मैंने एक python31.zip बनाया जिसमें सी: \ Python31 \ Lib \ *। * और सी: \ Python31 \ DLLs \ * शामिल हैं। * मैंने इसे अपने एप्लिकेशन EXE और python31.dll के साथ रखा है। कार्यक्रम काम करता है! ज़िप 13 मेग्स है, इसलिए, जैसा कि आप सुझाव देते हैं, मुझे केवल वही चीज़ समझनी चाहिए जो मुझे चाहिए और इसे कम करें। मैं इसे एक समाधान के रूप में चिह्नित कर रहा हूं, बहुत बहुत धन्यवाद! – apostrophest

+0

मैं python26.zip काम नहीं कर सका - लगभग सब कुछ करने की कोशिश की। क्या आप सुनिश्चित हैं कि python31.zip काम करते समय पाइथन * स्थापित नहीं किया गया था? स्टैक ओवरफ्लो (pythonxx.zip काम करने) पर अन्य सभी पोस्ट अनुत्तरित हैं! – sambha

11

अच्छा। और अगर आप ज़िप करने नहीं करना चाहते, के रूप में अपने exe निर्देशिका में कॉपी Python26 \ DLLs & Python26 \ lib:

.\myexe.exe  
.\python26.dll 
.\Python26\DLLs 
.\Python26\lib 

और फिर Py_SetPythonHome() API साथ PYTHONHOME निर्धारित किया है। जाहिर है, यह एपीआई से पहले "अनुमत" कॉल की सूची में नहीं है Py_Initialize();

#include "stdafx.h" 
#include <iostream> 
#include "Python.h" 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    char pySearchPath[] = "Python26"; 
    Py_SetPythonHome(pySearchPath); 
    Py_Initialize(); 
    PyRun_SimpleString("from time import time,ctime\n" 
        "print 'Today is',ctime(time())\n"); 
    //cerr << Py_GetPath() << endl; 
    Py_Finalize(); 

    return 0; 
} 

अच्छा है कि खोज पथ exe w.r.t रिश्तेदार है:

नीचे (अजगर नहीं स्थापित) विंडोज पर मेरे लिए काम किया। Py_GetPath आपको दिखा सकता है कि यह मॉड्यूल की तलाश में है।

+0

उपर्युक्त समाधान व्यवस्थापक उपयोगकर्ता के लिए ठीक काम करता है। हालांकि गैर-व्यवस्थापक उपयोगकर्ता के लिए, एप्लिकेशन प्रारंभ नहीं होता है। कोई विचार ? –

+0

@balasbellobas क्या आपके पाइथन में pywin32 है? मुझे लगता है कि मेरे पास एक समान समस्या थी (एम्बेडेड एक्सेल कॉम कॉल केवल "व्यवस्थापक" के रूप में काम करते थे)। कुछ gen_py समस्या थी जहां पायथन ने गैर-अनुमत फ़ोल्डर (शायद प्रोग्राम फाइल) में फ़ाइलों को बनाने का प्रयास किया था। आप gen_py पर और अधिक खोजना चाह सकते हैं। मुझे लगता है कि मुझे बस कुछ फाइलों को हटाना पड़ा। आशा करता हूँ की ये काम करेगा। – sambha

5

पायथन मानक पुस्तकालय का एक ज़िप पाइथन 27 के साथ मेरे लिए काम करता है।

मैंने को लिब और डीएल की सामग्री को ज़िपित किया, और सुनिश्चित किया कि कोई अतिरिक्त पायथन 27-उपफोल्डर या लीब या डीएल सबफ़ोल्डर नहीं था। यानी सिर्फ एक ज़िप जिसे python27.zip नाम दिया गया है जिसमें सभी फाइलें हैं।

मैंने निष्पादन योग्य के साथ उस ज़िप और python27.dll की प्रतिलिपि बनाई।

6

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

 
Program Files (x86)\ 
    MyApplicationFolder\ 
     MyApplication.exe 
     python27.dll 
     Python27\ 
      DLLs\ (contents of DLLs folder) 
      Lib\ (contents of Lib folder) 

एक महत्वपूर्ण इसके साथ: मैं भी msvcr90.dll स्थापित करने के लिए की जरूरत है। मैं पायथन 2.7 का उपयोग कर रहा हूं और स्पष्ट रूप से python27.dll को MSVCR90.DLL (और शायद अन्य एमएसवीसी * 90. डीएलएल) की आवश्यकता है।

मैंने http://www.microsoft.com/en-us/download/details.aspx?id=29 से 'vcredist_x86.exe' पैकेज को डाउनलोड, इंस्टॉल और चलाने के द्वारा हल किया। मुझे लगता है, हालांकि मैं निश्चित नहीं हूं कि आपको कम से कम Win7 पर ऐसा करने की आवश्यकता है, क्योंकि एमएसवीसी * 90. डीएलएल को आपके .exe के साथ ही अतीत में किया गया हो सकता है। माइक्रोसॉफ्ट इंस्टॉलर फ़ाइलों को रखता है और Win7 के तहत उन्हें एक विशेष तरीके से पंजीकृत करता है।

मैंने .zip फ़ाइल विधि भी कोशिश की लेकिन यह काम नहीं किया, यहां तक ​​कि MSVCR90.DLL स्थापित भी।

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