2012-10-28 36 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