2012-05-21 16 views
8

Evcil hayvan projeme bazı python yerleştirmeye çalışıyorum. Aşağıdaki kodu sorunumu azaltmıştır: (Python C API) PyRun_StringFile yerleşik işlevler eksik?

#include <Python.h> 
#include "iostream" 

int main(int argc, char *argv[]) 
{ 
    Py_Initialize(); 

    PyObject *globals = Py_BuildValue("{}"); 
    PyObject *locals = Py_BuildValue("{}"); 

    PyObject *string_result = PyRun_StringFlags(
     "a=5\n" 
     "s='hello'\n" 
     "d=dict()\n" 
     , 
     Py_file_input, globals, locals, NULL); 
    if (PyErr_Occurred()) {PyErr_Print();PyErr_Clear();return 1;} 
    return 0; 
} 

(. Ben herhangi bir referans temizlemeyeceğim biliyorum Bu bir örnektir.) O

c++ $(python-config --includes) $(python-config --libs) test.cpp -o test 
tarafından derlenen edilebilir

bunu çalıştırırsanız

aşağıdaki hatayı alıyorum:

$ ./test 
Traceback (most recent call last): 
    File "<string>", line 3, in <module> 
NameError: name 'dict' is not defined 

yerleşik işlevler yüklenmez görünüyor. Ben de hiçbir şey için import yapamam. __import__'un eksik olduğunu anlıyorum. Kayıp modülleri veya eksik olduğum şeyleri nasıl yükleyebilirim?

Teşekkürler.

cevap

7

Tek yönlü:

g = PyDict_New(); 
if (!g) 
    return NULL; 

PyDict_SetItemString(g, "__builtins__", PyEval_GetBuiltins()); 

Sonra globals olarak g geçmektedir.

+0

Teşekkürler! PyEval_GetBuiltins, tam ihtiyacım olan şeydi. Sadece nasıl bulacağımı bilmiyordum. – Simon

4

Ayrıca __main__ modül ad içinde kod yürütebilir:

PyObject *globals = PyModule_GetDict(PyImport_AddModule("__main__")); 
PyObject *obj = PyRun_String("...", Py_file_input, globals, globals); 
Py_DECREF(obj); 

Bu PyRun_SimpleStringFlags içten ne yaptığını aslında.