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

Я пытаюсь вызвать функции 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...


person PeterG    schedule 22.11.2011    source источник
comment
Я действительно думаю, что функция PyString_FromString была переименована в PyBytes_FromString в Python 3.x.   -  person Tarantula    schedule 22.11.2011


Ответы (1)


Пример кода, который вы использовали, относится к древней версии 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 использует строки Unicode.

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

Индекс — P

person yak    schedule 22.11.2011
comment
поэтому я последовал вашему предложению, и это сработало. теперь я хочу протестировать его, используя предоставленный вами пример документации. я захожу в каталог .exe и cmd «вызов умножить умножить 3 2» ?? - person PeterG; 22.11.2011
comment
Я так думаю, да, если предположить, что exe-файл называется call. Если вы застряли, задайте отдельный вопрос. - person yak; 22.11.2011