встраивание питона - PullRequest
       37

встраивание питона

7 голосов
/ 22 ноября 2011

Я пытаюсь вызвать функции Python из кода C, и я последовал примеру здесь

У меня также есть правильные директории включения файлов, директории библиотек и связанные python32.lib (я использую python 32), однако ошибка заключалась в том, что такие API-интерфейсы python / C, как PyString_FromString, PyInt_FromLong, PyInt_AsLong, не определены (ошибка в отладчике )

это странно, потому что я также использую другие API, но они все в порядке ...

в чем здесь проблема ??

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 ...

1 Ответ

19 голосов
/ 22 ноября 2011

Пример кода, который вы использовали, для древней версии Python, 2.3.2. В строке Python 3.x появилось несколько несовместимостей не только в языке, но и в C API.

Упомянутые вами функции просто больше не существуют в Python 3.2.

PyString_ функции были переименованы в PyBytes_.

PyInt_ функций больше нет, вместо них следует использовать PyLong_.

Вот тот же пример, который вы использовали, но для Python 3:

5,3. Чистое вложение

Обратите внимание, что используется PyUnicode_ вместо PyString_/PyBytes_. Во многих местах, где Python 2.x использует байтовые строки, Python 3.x использует строки юникода.

Кстати, я обычно использую эту страницу для поиска всех возможных звонков:

Индекс - P

...