2016-10-02 75 views

回答

2

通過做一些調查,我發現這可以通過使用以下四個API連續完成。

  • PyModule_GetDict;獲取屬於python模塊的項目。 *

  • PyDict_GetItemString;獲取對應於Python類 名稱的項目。

  • PyObject_CallObject;創建Python對象。 *
  • PyObject_CallMethod;分類對象的方法。

以下是我創建的示例代碼,即使它仍需要改進。

// Refer to the following website for more information about embedding the 
// Python code in C++. 
// https://docs.python.org/2/extending/embedding.html 
int main() { 
    PyObject *module_name, *module, *dict, *python_class, *object; 

    // Initializes the Python interpreter 
    Py_Initialize(); 

    module_name = PyString_FromString(
     "work.embedding_python_in_cpp.example.adder"); 

    // Load the module object 
    module = PyImport_Import(module_name); 
    if (module == nullptr) { 
    PyErr_Print(); 
    std::cerr << "Fails to import the module.\n"; 
    return 1; 
    } 
    Py_DECREF(module_name); 

    // dict is a borrowed reference. 
    dict = PyModule_GetDict(module); 
    if (dict == nullptr) { 
    PyErr_Print(); 
    std::cerr << "Fails to get the dictionary.\n"; 
    return 1; 
    } 
    Py_DECREF(module); 

    // Builds the name of a callable class 
    python_class = PyDict_GetItemString(dict, "Adder"); 
    if (python_class == nullptr) { 
    PyErr_Print(); 
    std::cerr << "Fails to get the Python class.\n"; 
    return 1; 
    } 
    Py_DECREF(dict); 

    // Creates an instance of the class 
    if (PyCallable_Check(python_class)) { 
    object = PyObject_CallObject(python_class, nullptr); 
    Py_DECREF(python_class); 
    } else { 
    std::cout << "Cannot instantiate the Python class" << std::endl; 
    Py_DECREF(python_class); 
    return 1; 
    } 

    int sum = 0; 
    int x; 

    for (size_t i = 0; i < 5; i++) { 
    x = rand() % 100; 
    sum += x; 
    PyObject *value = PyObject_CallMethod(object, "add", "(i)", x); 
    if (value) 
     Py_DECREF(value); 
    else 
     PyErr_Print(); 
    } 
    PyObject_CallMethod(object, "printSum", nullptr); 
    std::cout << "the sum via C++ is " << sum << std::endl; 

    std::getchar(); 
    Py_Finalize(); 

    return (0); 
} 
相關問題