2012-10-28 35 views
3

我已經通過google進行了搜索,以及許多refence,但是我只看到一個複雜的編碼示例,你會給我一個示例(簡單代碼),所以我可以理解。 我已經編寫它,但它每次打破我運行它 下面的代碼簡單示例如何在C/C++中調用Python函數

#include <Python.h> 
int main() 
{ 
    PyObject *pName, *pModule, *pDict, *pFun, *pValue; 
    // Initialize the Python Interpreter 
    Py_Initialize(); 
// Build the name object 
pName = PyString_FromString("C:\\Documents and Settings\\MASTER\\My Documents\\Visual Studio  2010\\Projects\\Python\\Test.py"); 
if(pName)printf("OK"); 

// Load the module object 
pModule = PyImport_Import(pName); 

// pDict is a borrowed reference 
pDict = PyModule_GetDict(pModule); 

// pFunc is also a borrowed reference 
pFun = PyDict_GetItemString(pDict, "prinTname"); 

if (PyCallable_Check(pFun)) 
{ 
    PyObject_CallObject(pFun, NULL); 
} else 
{ 
    PyErr_Print(); 
} 

// Clean up 
Py_DECREF(pModule); 
Py_DECREF(pName); 

Py_DECREF(pDict); 
Py_DECREF(pFun); 
// Finish the Python Interpreter 
Py_Finalize(); 
getchar(); 
return 0; 
} 

,並有在Python.exe一些消息 第一次機會異常在0x1e00503b:0000005:訪問衝突讀取位置0x00000004 。 Python.exe中的0x1e00503b未處理的異常:0xC0000005:訪問衝突讀取位置0x00000004。 程序'[4548] Python.exe:Native'已退出,代碼爲0(0x0)。

+0

至於你的問題,你有沒有試過在調試器中運行你的程序?你確定所有的函數調用都成功嗎? –

+0

我已經建立了它在VS 2010和它建立成功了,我只是想它調用C/C++ 這是Python代碼: DEF prinTname(): \t打印「OK玩轉」 –

回答

0

您很可能還沒有安裝python開發工具,即從未找到python.h。找到python.h並查找編譯錯誤並重新發布,如果有的話。

編輯:這是舊的信息。包括應該像將include目錄添加到include目錄一樣簡單,請參閱:How do I get Visual Express 2010 to find my python.h header file?

+0

如何添加的Python將文件(* .py)放入我的VS2010中的C/C++項目中? 你可以給我一個簡單的例子,如何在C/C++中調用python函數? –

+0

你首先需要python-dev。如果你只想從C中調用Python,請參閱http://docs.python.org/release/2.4.2/ext/callingPython.html或http://www.codeproject.com/Articles/11805/Embedding-Python- in-CC-Part-I – RParadox

+0

python-dev?它是一個工具/ sdk?在哪裏我可以得到它? –

2

下面是我詢問的問題的一些代碼。這應該做你想做的。

參數數量: 的argv [1]包含路徑到你的.py文件 的argv [2]包含要調用的函數的名稱

int wmain(int argc, wchar_t** argv) 
{ 
    PyObject* py_imp_str; 
    PyObject* py_imp_handle; 
    PyObject* py_imp_dict; //borrowed 
    PyObject* py_imp_load_source; //borrowed 
    PyObject* py_dir; //stolen 
    PyObject* py_lib_name; //stolen 
    PyObject* py_args_tuple; 
    PyObject* py_lib_mod; 
    PyObject* py_func; 
    PyObject* py_ret; 

    Py_Initialize(); 

    //import our python script using the imp library (the normal import doesn't allow you to grab py files in random directories) 
    py_dir = PyUnicode_FromWideChar(argv[1], wcslen(argv[1])); 
    py_imp_str = PyString_FromString("imp"); 
    py_imp_handle = PyImport_Import(py_imp_str); //normal python import for imp 
    py_imp_dict = PyModule_GetDict(py_imp_handle); //borrowed 
    py_imp_load_source = PyDict_GetItemString(py_imp_dict, "load_source"); //borrowed 
    py_lib_name = PyUnicode_FromWideChar(argv[2], wcslen(argv[2])); 

    //setup args for imp.load_source 
    py_args_tuple = PyTuple_New(2); 
    PyTuple_SetItem(py_args_tuple, 0, py_lib_name); //stolen 
    PyTuple_SetItem(py_args_tuple, 1, py_dir); //stolen 

    //call imp.load_source 
    py_lib_mod = PyObject_CallObject(py_imp_load_source, py_args_tuple); 
    py_lib_mod_dict = PyModule_GetDict(py_lib_mod); //borrowed 

    //get function object 
    py_func = PyDict_GetItem(py_lib_mod_dict, py_lib_name); 
    //call function object 
    py_ret = PyObject_CallFunction(py_func, NULL); 

    if (py_ret) 
    { 
     printf("PyObject_CallFunction from wmain was successful!\n"); 
     Py_DECREF(py_ret); 
    } 
    else 
     printf("PyObject_CallFunction from wmain failed!\n"); 

    Py_DECREF(py_imp_str); 
    Py_DECREF(py_imp_handle); 
    Py_DECREF(py_args_tuple); 
    Py_DECREF(py_lib_mod); 

    Py_Finalize(); 

    fflush(stderr); 
    fflush(stdout); 
    return 0; 
} 

如果你還沒有發現這個已經,以下鏈接描述了Python的C接口。非常好用: http://docs.python.org/2/c-api/index.html