【问题标题】:Simple Example How To Call Python Function in C/C++如何在 C/C++ 中调用 Python 函数的简单示例
【发布时间】:2012-10-28 13:33:16
【问题描述】:

我已经通过谷歌搜索了很多参考资料,但我只看到了一个复杂的编码示例,你能给我一个例子(简单代码)以便我理解。 我已经编写了代码,但每次运行它都会中断 这是代码

#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 处的第一次机会异常:0xC0000005:访问冲突读取位置 0x00000004。 Python.exe 中 0x1e00503b 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。 程序“[4548] Python.exe: Native”已退出,代码为 0 (0x0)。

【问题讨论】:

  • 至于你的问题,你试过在调试器中运行你的程序吗?你确定所有的函数调用都成功了吗?
  • 我已经在 VS 2010 中构建了它并且构建成功了,我只想在 C/C++ 中调用它这是 python 代码:def prinTname(): print "OK Fun"

标签: python c++ c


【解决方案1】:

这是我提出的问题中的一些代码。这应该可以满足您的需求。

参数: 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

【讨论】:

    【解决方案2】:

    您很可能没有安装 python 开发工具,即从未找到 python.h。找到 python.h 并查找编译错误并重新发布。

    编辑:这是旧信息。包含应该像将包含目录添加到包含目录一样简单,请参阅:How do I get Visual Express 2010 to find my python.h header file?

    【讨论】:

    • 如何在我的 VS2010 中将 Python 文件 (*.py) 添加到我的 C/C++ 项目中?你能给我一个简单的例子,如何在 C/C++ 中调用 python 函数吗?
    • 你首先需要 python-dev。如果您只想从 C 调用 Python,请参阅 docs.python.org/release/2.4.2/ext/callingPython.htmlcodeproject.com/Articles/11805/Embedding-Python-in-C-C-Part-I
    • python 开发?它是工具/sdk 吗?我在哪里可以买到?
    • 查看我的帖子 ;) 如果你安装了 python-dev,python.h 会被找到(希望如此)。实际上那些windows链接并没有解释它。但它必须在某个地方。
    • 抱歉,这是旧信息。 Python.h 现在可以在 Python/include 文件夹中找到。
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 2021-06-28
    • 2010-12-13
    • 1970-01-01
    • 2015-04-13
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多