2017-06-23 16 views
7

एम्बेड करते समय विलंब लोड पायथन डीएलएल मैं एक सी ++ एप्लिकेशन बना रहा हूं जो पायथन + numpy को कॉल करेगा और मैं पायथन डीएलएल को हटाना चाहता हूं। मैं विंडोज़ पर विजुअल स्टूडियो 2015 का उपयोग 64 बिट पायथन 3.6 के साथ करता हूं। जब तक मैं numpy का उपयोग नहीं कर रहा हूं, DELELOAD ठीक काम करता है। जैसे ही मैं import_array() पर कॉल करता हूं, अब मैं DELAYLOAD विकल्प के साथ निर्माण नहीं कर सकता। लिंकर त्रुटिपाइथन + numpy

LNK1194 डेटा प्रतीक '__imp_PyExc_ImportError' के आयात के कारण 'python36.dll' देरी-लोड नहीं कर सकता; /DELAYLOAD:python36.dll के बिना लिंक।

// Initialize python 
Py_Initialize(); 

// If I remove this line, I am able to build with DELAYLOAD 
import_array(); 

वहाँ जब numpy का उपयोग कर देरी लोड संभव बनाने के लिए कोई तरीका है:

यहाँ मेरी कोड है?

वैकल्पिक प्रश्न: क्या import_array() को कॉल किए बिना डेटा को numpy.recarray बनाना और भरना संभव है?

संपादित करें: मैंने import_array() से छुटकारा पाने का निर्णय लिया है।

if (!Py_IsInitialized()) 
    { 
     // Initialize Python 
     Py_Initialize(); 

     // Initialize threads 
     PyEval_InitThreads(); 

     // Needed for datetime 
     PyDateTime_IMPORT; 

     // Needed to avoid use of Py_None, Py_True, and Py_False; 
     // which cause inability to use DELAYLOAD 
     HMODULE pythonDll = GetModuleHandle(L"python36.dll"); 
     if (pythonDll == nullptr) 
     { 
      throw gcnew NotSupportedException(L"GS_ERR_CannotInitialize"); 
     } 
     PythonHelper::_pyNone = (PyObject*)GetProcAddress(pythonDll, "_Py_NoneStruct"); 
     PythonHelper::_pyTrue = (PyObject*)GetProcAddress(pythonDll, "_Py_TrueStruct"); 
     PythonHelper::_pyFalse = (PyObject*)GetProcAddress(pythonDll, "_Py_FalseStruct"); 
    } 
+0

क्या आपने बिल्ड रिलीज/डीबग के दो प्रकारों को आजमाया है? कभी-कभी यह मदद करता है। – fghj

+0

दुर्भाग्यवश, मुझे नहीं मिला और डिबग का निर्माण खराब हो गया, इसलिए केवल रिलीज LIB/DLL –

+0

का उपयोग करके आप अपने सी ++ ऐप में numpy का संदर्भ कैसे दे रहे हैं? क्या आपने इसे नमस्ते निर्देशों के अनुसार स्रोत से बनाया था? – denfromufa

उत्तर

1

है वहाँ जब numpy का उपयोग कर देरी लोड संभव बनाने के लिए किसी भी तरह से: यहाँ कोड है कि मैं अजगर को प्रारंभ करने के लिए उपयोग में से कुछ है?

आप import_array साथ DELAYLOAD उपयोग करने में सक्षम नहीं हो सकता है:

  1. आप एक DLL लोड देरी नहीं कर सकते हैं अगर डेटा यह (official documentation) से आयात किया जाता।

  2. import_array मॉड्यूल जहां समारोह-सूचक तालिका संग्रहीत और यह (official documentation) करने के लिए सही चर बताते है आयात करता है।

मुझे शक है आप निर्यात कक्षाएंबनाम डेटा सदस्यों निर्यात का मामला के साथ काम कर रहे हैं। this, this, या this देखें।

+0

क्या आप कृपया numpy के आधिकारिक दस्तावेज को एक लिंक दे सकते हैं जो कहता है कि यह असंभव है। –

+0

@AndreyBelykh - बेवकूफ दस्तावेज संभवतः विशिष्ट लिंकर्स + झंडे से जोड़ने के साथ मुद्दों का उल्लेख नहीं करेंगे, जो कि बहुत विशिष्ट होंगे। लेकिन मैंने एमएसवीएस + numpy के आधिकारिक दस्तावेज के साथ जवाब अद्यतन किया जो निष्कर्ष की अनुमति देता है। –

+0

धन्यवाद। ऐसा लगता है कि मुझे import_array() का उपयोग करने से बचना होगा। –

0

यह ऑप्टिमाइज़ेशन के कारण भी हो सकता है, जैसा कि here देखा गया है।

आप परियोजना सेटिंग्स में Remove unreferenced code and data पर भी प्रयास कर सकते हैं।

+0

असुरक्षित कोड निकालें और डेटा "सत्य" पर सेट है –

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