2011-11-22 12 views
7

इम सी कोड से अजगर कार्यों कॉल करने के लिए कोशिश कर रहा है, और मैं से hereembedding अजगर

एक नमूना मैं भी सही फ़ाइल directries, पुस्तकालय directries शामिल है पीछा किया, और python32.lib जुड़े हुए (आईएम अजगर 32 का प्रयोग करके) लेकिन त्रुटि है कि इस तरह के PyString_FromString, PyInt_FromLong, PyInt_AsLong के रूप में अजगर/सी एपीआई अपरिभाषित कर रहे हैं (डिबगर में त्रुटि)

यह अजीब है क्योंकि im भी अन्य APIs का उपयोग है, लेकिन वे सब ठीक हो ... था

यहां समस्या क्या है ??

int 
main(int argc, char *argv[]) 
{ 
    PyObject *pName, *pModule, *pDict, *pFunc; 
    PyObject *pArgs, *pValue; 
    int i; 

    if (argc < 3) { 
     fprintf(stderr,"Usage: call pythonfile funcname [args]\n"); 
     return 1; 
    } 

    Py_Initialize(); 
    pName = PyString_FromString(argv[1]); 
    /* Error checking of pName left out */ 

    pModule = PyImport_Import(pName); 
    Py_DECREF(pName); 

    if (pModule != NULL) { 
     pDict = PyModule_GetDict(pModule); 
     /* pDict is a borrowed reference */ 

Py_Initialize(), PyImport_Import(), PyModule_GetDict() सब ठीक काम करते हैं, लेकिन PyString_FromString नहीं ...

+2

मैं वास्तव में लगता है कि समारोह PyString_FromString अजगर 3.x. में PyBytes_FromString को नाम दिया गया था:

वैसे, मैं आमतौर पर हर संभव कॉल को देखने के लिए इस पृष्ठ का उपयोग – Tarantula

उत्तर

18

आप इस्तेमाल किया उदाहरण कोड, प्राचीन अजगर संस्करण के लिए है 2.3.2। पायथन 3.x लाइन ने न केवल भाषा में बल्कि सी एपीआई में कई असंगतताओं को भी पेश किया।

आपके द्वारा उल्लेख किए गए फ़ंक्शंस अब पाइथन 3.2 में मौजूद नहीं हैं।

PyString_ फ़ंक्शंस का नाम बदलकर PyBytes_ कर दिया गया।

PyInt_ फ़ंक्शन चलाए गए हैं, PyLong_ इसके बजाए उपयोग किया जाना चाहिए।

यहाँ एक ही उदाहरण है कि आप का उपयोग किया है, लेकिन अजगर 3 के लिए:

5.3. Pure Embedding

नोट यह PyUnicode_ बजाय PyString_/PyBytes_ उपयोग कर रहा है कि। कई स्थानों पर जहां पायथन 2.x बाइट तारों का उपयोग करता है, पायथन 3.x यूनिकोड स्ट्रिंग का उपयोग करता है।

Index – P

+0

इसलिए मैंने आपके सुझाव का पालन किया और यह काम किया। अब मैं आपके द्वारा प्रदत्त प्रलेखन उदाहरण का उपयोग करके इसका परीक्षण करना चाहता हूं। क्या मैं .exe निर्देश में जाता हूं और cmd 'कॉल गुणा 3 गुणा गुणा करता हूं ?? – PeterG

+0

मुझे ऐसा लगता है, हाँ, मान लीजिए कि exe फ़ाइल को 'कॉल' कहा जाता है। अगर आप अटक जाते हैं, तो एक अलग सवाल पूछें। – yak