2012-05-21 24 views
8

Tôi đang cố gắng nhúng một số python vào dự án thú cưng của mình. Tôi đã làm giảm vấn đề của tôi để đoạn mã sau:(Python C API) PyRun_StringFlags thiếu các hàm dựng sẵn?

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

(. Tôi biết tôi không dọn dẹp bất kỳ tài liệu tham khảo này là một ví dụ.)

nó có thể được biên soạn bởi

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

Nếu tôi chạy nó, tôi nhận được lỗi sau:

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

Có vẻ như các hàm dựng sẵn không được tải. Tôi cũng không thể import bất kỳ thứ gì. Tôi nhận được rằng __import__ bị thiếu. Làm thế nào tôi có thể tải các mô-đun bị thiếu hoặc bất cứ điều gì tôi bị thiếu?

Cảm ơn.

Trả lời

7

Một cách:

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

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

Và sau đó vượt qua g như globals.

+0

Cảm ơn! 'PyEval_GetBuiltins' chính là thứ tôi cần. Tôi chỉ không biết cách tìm nó. – Simon

4

Bạn cũng có thể thực thi mã bên trong namespace __main__ mô-đun:

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

này là trong thực tế những gì PyRun_SimpleStringFlags làm trong nội bộ.

Các vấn đề liên quan