2012-05-21 115 views
8

我想在我的寵物項目中嵌入一些python。我已經減少了我的問題下面的代碼:(Python C API)PyRun_StringFlags缺少內置函數?

#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; 
} 

(我知道我沒有清理任何引用這是一個例子。)

它可以通過

c++ $(python-config --includes) $(python-config --libs) test.cpp -o test 
編譯

如果我運行它,我得到以下錯誤:

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

看來內建的功能不會被加載。我也不能import什麼。我得到__import__丟失。我如何加載缺失的模塊或我缺少的東西?

謝謝。

回答

7

方式一:

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

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

再經過gglobals

+0

謝謝! 「PyEval_GetBuiltins」正是我所需要的。我只是不知道如何找到它。 – Simon

4

你也可以執行代碼的__main__模塊命名空間中:

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

這實際上是什麼PyRun_SimpleStringFlags內部做。