Встраивание Python в C для файлов конфигурации - PullRequest
1 голос
/ 20 октября 2010

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

Если я делаю это так:

/******************************************************************************
* 
* Embeding Python Example
*
* To run: 
*   gcc -c test.c -o test.o -I"C:/Python25/include"
*   gcc -o test.exe test.o -L"C:/Python25/libs" -lpython25
*   test.exe
*
******************************************************************************/

#include <Python.h>

int main(int argc, char *argv[])
{
    PyObject *run;
    PyObject *globals = PyDict_New();
    PyObject *locals = PyDict_New();

    Py_Initialize();

    run = PyRun_String("from time import time,ctime\n"
                       "print 'Today is',ctime(time())\n"
                        "test = 5\n"
                        "print test\n", Py_file_input, globals, locals);


    Py_Finalize();
    return 0;
}

Я получаю ошибку времени выполнения отMicrosoft VIsual C ++ Runtime, с таким сообщением:

Exception exceptions.ImportError: '__import__ not found' in 'garbage collection' ignored
Fatal Python error: unexpected exception during garbage collection

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 21 августа 2012

То, что вы делаете неправильно, это именно то, что я делал неправильно.

Вы инициализируете свой собственный словарь globals пустым.Это означает, что даже такие вещи, как __import__, не определены для текущей области.

В вашем простом примере вы можете заменить

run = PyRun_String("from time import time,ctime\n"
                   "print 'Today is',ctime(time())\n"
                    "test = 5\n"
                    "print test\n", Py_file_input, globals, locals);

на

PyRun_SimpleString("from time import time,ctime\n"
                   "print 'Today is',ctime(time())\n"
                   "test = 5\n"
                   "print test\n");

You 'Я, вероятно, захочу полностью удалить globals и locals.

Если я узнаю, как получить доступ к глобальному диктатуру default , я добавлю комментарий или отредактирую здесь.

Редактировать: Реализация PyRun_SimpleStringFlags (Python 2.7.3) выглядит следующим образом:

int PyRun_SimpleStringFlags(const char *command, PyCompilerFlags *flags)
{
    PyObject *m, *d, *v;
    m = PyImport_AddModule("__main__");
    if (m == NULL)
        return -1;
    d = PyModule_GetDict(m);
    v = PyRun_StringFlags(command, Py_file_input, d, d, flags);
    ...

Таким образом, чтобы получить по умолчанию globals диктуют, что вам придется импортировать __main__ и получить его словарь .Он будет содержать все встроенные функции по умолчанию и т. Д.

0 голосов
/ 20 октября 2010

Вы создаете 2 объекта Python до того, как инициализируете движок Python.

Кроме того, это глупо.Есть много JSON-парсеров для C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...