下面c_python_utils.h是處理工具函數,test.cpp是測試程序,hello.py是python類python
但是當我集成到項目中的時候,PyImport_Import老是返回爲空,起初我覺得是init()中設置目錄的問題,可是目錄設置的是當前目錄,hello.py也放在當前目錄。服務器
然而,而後讓我發現項目是部署在服務器上的,而服務器上可執行文件在某個目錄內,這個目錄下根本就沒有hello.py(由於我沒有放進去)app
因此,根本就在當前目錄下找不到,就是這個小小的問題,都把我折騰了很久,如今想起來真是心傷啊。不過仍是解決了。函數
/*************************************************************************************************** c_python_utils.h C++ Network Library, Copyright (c) Datatom Software, Inc.(2015) Author: liu.pan (liu.pan@datatom.com) Creating Time: 2015-5-4 ***************************************************************************************************/ #ifndef _DTCORE_C_PYTHON_UTILS_H_ #define _DTCORE_C_PYTHON_UTILS_H_ #include <Python.h> #include <stdio.h> #ifdef __cplusplus extern "C" { #endif /* C++ */ /** * 調用python類中的成員函數 * @param module python腳本名稱,不含擴展 * @param class_name python類名稱 * @param function python類成員函數 * @param format python類函數參數格式 * @return 返回字符串 */ char* py_call( const char* module, const char* class_name, char* function, char* format, ... ) { PyObject* pName = NULL; PyObject* pMod = NULL; PyObject* pDict = NULL; PyObject* pClass = NULL; PyObject* pInstance = NULL; PyObject* pParam = NULL; PyObject* pResult = NULL; // 導入模塊 pName = PyString_FromString(module); pMod = PyImport_Import(pName); if( !pMod ) { return ""; } // 獲取模塊字典屬性 pDict = PyModule_GetDict(pMod); if ( !pDict ) { return ""; } // 經過字典獲取模塊中的類 pClass = PyDict_GetItemString(pDict, class_name); if ( !pClass ) { return ""; } pInstance = PyInstance_New(pClass, NULL, NULL); if ( !pInstance ) { return ""; } pResult = PyObject_CallMethod(pInstance, function, format); char *rlt_ch = NULL; PyArg_Parse( pResult, "s", &rlt_ch ); return rlt_ch; } /** * 一些環境的初始化 * */ void init() { Py_Initialize(); PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); } /** * 逆初始化 */ void finit() { Py_Finalize(); } #ifdef __cplusplus } /* extern "C" */ #endif /* C++ */ #endif //_DTCORE_C_PYTHON_UTILS_H_
// test.cpp #include "c_python_utils.h" #include <stdio.h> int main(int argc, char const *argv[]) { init(); char* rlt_char = py_call("hello", "power", "liupan", "()"); finit(); printf("%s\n", rlt_char); return 0; }
# hello.py class power(): def liupan(self): return "hello world"
因此,若是PyImport_Import老是返回爲空,必定是查詢目錄的問題,要麼目錄設置錯誤,要麼python代碼根本沒有在這個目錄內。工具
由於C調用python是運行時執行的,而不是編譯時連接的。測試