2012-03-05 25 views
5

Tôi đang cố gắng tìm hiểu cách sử dụng trình thông dịch Python từ C và tôi gặp sự cố với PyEval_EvalCode. Về cơ bản, tôi đang viết một hàm C trong một chuỗi mã Python tùy ý, biên dịch nó, thực hiện nó, và sau đó in ra kết quả.API C C: Sử dụng PyEval_EvalCode

Vấn đề là khi tôi in kết quả, tôi luôn nhận được None, ngay cả khi biểu thức rõ ràng không đánh giá được None.

Đây là mã (với kiểm tra lỗi và tính tham khảo xóa do rõ ràng):

void eval(const char* s) 
{ 
    PyCodeObject* code = (PyCodeObject*) Py_CompileString(s, "test", Py_file_input); 
    PyObject* main_module = PyImport_AddModule("__main__"); 
    PyObject* global_dict = PyModule_GetDict(main_module); 
    PyObject* local_dict = PyDict_New(); 
    PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict); 

    PyObject* result = PyObject_Str(obj); 
    PyObject_Print(result, stdout, 0); 
} 

Tôi đã thử gọi chức năng này với "5 + 5" như đầu vào, và nó hiển thị None. Tôi có đang sử dụng PyEval_EvalCode không chính xác không?

Trả lời

7

Nếu muốn đánh giá biểu thức, bạn cần sử dụng Py_eval_input làm đối số cho Py_CompileString.

sự hiểu biết của tôi về vấn đề là:

  • Py_eval_input tương đương với built-in eval - nó đánh giá một biểu thức.
  • Py_file_input tương đương với exec - Nó thực thi mã Python, nhưng không trả về bất kỳ thứ gì.
  • Py_single_input đánh giá một biểu thức và in giá trị của nó - được sử dụng trong trình thông dịch.

Xem here để biết thêm, nhưng tài liệu về chủ đề này yếu.