2011-11-22 13 views
7

Nel tentativo di richiamare le funzioni Python da codice C, e ho seguito un campione da herecontiene Python

ho anche il corretto includono directries file, directries biblioteca, e collegato il python32.lib (im utilizzando python 32) tuttavia l'errore è stato che Python/C API come PyString_FromString, PyInt_FromLong, PyInt_AsLong sono indefiniti (errore nel debugger)

questo è strano perché im utilizzando anche altre API, ma sono tutti bene ...

qual è il problema qui ??

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() tutto il lavoro bene, ma non PyString_FromString ...

+2

Credo davvero che la funzione PyString_FromString è stato rinominato PyBytes_FromString nella 3.x. Python – Tarantula

risposta

18

Il codice di esempio che hai usato sia per l'antica versione di Python, 2.3.2. La linea Python 3.x ha introdotto un numero di incompatibilit non solo nella lingua ma anche nell'API C.

Le funzioni che hai citato semplicemente non esistono più in Python 3.2.

PyString_ le funzioni sono state rinominate in PyBytes_.

PyInt_ le funzioni sono esaurite, è consigliabile utilizzare PyLong_.

Ecco lo stesso esempio che hai utilizzato, ma per Python 3:

5.3. Pure Embedding

Si noti che si tratta di utilizzare al posto di PyUnicode_PyString_/PyBytes_. In molti posti in cui Python 2.x utilizzava stringhe di byte, Python 3.x utilizza stringhe unicode.

A proposito, io di solito uso questa pagina per cercare tutte le possibili chiamate:

Index – P

+0

quindi ho seguito il tuo suggerimento e ha funzionato. ora voglio testarlo usando l'esempio di documentazione che hai fornito. vado nella directory .exe e chiamata cmd moltiplicare moltiplicare 3 2 '?? – PeterG

+0

Penso di sì, sì, supponendo che il file exe sia chiamato 'call'. Se rimani bloccato, fai una domanda a parte. – yak