2016-10-14 2 views
0

Я бы хотел использовать Python для выполнения математических тестов для моих функций. Типичная программа, которая может получить доступ к Python это:Расширение Python C: Извлечь параметр из движка

#include <iostream> 
#include <string> 
#include <Python.h> 
int RunTests() 
{ 
    Py_Initialize(); 

    PyRun_SimpleString("a=5"); 
    PyRun_SimpleString("b='Hello'"); 
    PyRun_SimpleString("c=1+2j"); 
    PyRun_SimpleString("d=[1,3,5,7,9]"); 

    //question here 

    Py_Finalize(); 
    return 0; 
} 

Мой вопрос: Как я могу извлечь параметры a,b,c,d в PyObject ы?

ответ

1

PyRun_SimpleString() выполняет код в контексте модуля __main__. Вы можете получить ссылку на этот модуль с помощью PyImport_AddModule(), получить словарь глобалам из этого модуля и подстановки переменных:

PyObject *main = PyImport_AddModule("__main__"); 
PyObject *globals = PyModule_GetDict(main); 
PyObject *a = PyDict_GetItemString(globals, "a"); 

Вместо того, чтобы использовать этот подход, вы могли бы быть лучше создать новый globals словарь и используя PyRun_String() для выполнения код в контексте этого globals Dict:

PyObject *globals = PyDict_New(); 
PyObject *a = PyRun_String("5", Py_single_input, globals, globals); 

Таким образом, вам не нужно сначала сохранить результат вашего выражения в некоторой переменной, а затем извлечь его из глобального объема __main__. Вы можете использовать переменные для хранения промежуточных результатов, которые затем могут быть извлечены из globals, как указано выше.

+0

Это генерирует исключение ошибки сегментации SIGSEGV при 'a' при отладке. Есть ли другие звонки, которые я должен сделать рядом с этим? –

+0

Только что выяснили, что 'PyEval_GetLocals' возвращает' NULL'! Вы знаете, почему? Двигатель работает в соответствии с кодом, который я предоставил. –

+0

Прошу прощения. Ваш код не работает. http://stackoverflow.com/questions/40046330/python-c-extension-pyeval-getlocals-returns-null –

Смежные вопросы