Встраивание Python в C - импорт модулей - PullRequest
7 голосов
/ 02 сентября 2011

У меня проблемы с использованием встроенного Python для C согласно Документации - Всякий раз, когда я пытаюсь использовать импортированные модули, я получаю:

Необработанное исключение в 0x1e089e85 в PythonIncl.exe: 0xC0000005: Место чтения нарушения доступа 0x00000004.

Ошибка возникает в методе PyObject_GetAttrString(), и документация не сильно помогает.Я также пытался использовать учебники, как в Example от IBM, но всегда получал одно и то же нарушение прав доступа.

Ниже приведен пример кода из одного из учебников, который мне не кажетсячтобы начать работу, что здесь не так?

C-код (в одном основном файле):

#include <Python.h>
int main()
{
    PyObject *strret, *mymod, *strfunc, *strargs;
    char *cstrret;
    Py_Initialize();
    mymod = PyImport_ImportModule("reverse");
    strfunc = PyObject_GetAttrString(mymod, "rstring");
    strargs = Py_BuildValue("(s)", "Hello World");
    strret = PyEval_CallObject(strfunc, strargs);
    PyArg_Parse(strret, "s", &cstrret);
    printf("Reversed string: %s\n", cstrret);
    Py_Finalize();
    return 0;
}

Python-код (в файле с именем reverse.py, в той же папке):

def rstring(s):
    i = len(s)-1
    t = ''
    while(i > -1):
        t += s[i]
        i -= 1
    return t

Я работаю на машине с XP, использующей MSVS2008, Python 2.7

Немного контекста: я пытаюсь встроить небольшой скрипт на Python, использующий OpenOPC, в довольно большой C-Программа и хотел бы передавать данные между ними.Тем не менее, я уже провалил тест на проверку концепции с базовыми примерами.

Ответы [ 2 ]

16 голосов
/ 02 сентября 2011

Проверьте результат вызова PyImport_ImportModule: сбой и возврат NULL.Это связано с тем, что по умолчанию текущий каталог отсутствует в пути поиска.Добавьте

PySys_SetPath("."); // before ..
mymod = PyImport_ImportModule("reverse");

, чтобы добавить текущий каталог в путь поиска модуля и заставить ваш пример работать.

2 голосов
/ 02 сентября 2011

Вы продолжаете, не проверяя на ошибки, поэтому не шокирует ваш код таким образом. Из вашего описания звучит так: mymod - это NULL, что соответствует неудачному импорту. Одной из возможных причин неудачного импорта является то, что отправленный вами reverse.py имеет синтаксическую ошибку.

...