在 C++ 中嵌入 python

Posted

技术标签:

【中文标题】在 C++ 中嵌入 python【英文标题】:embedding python in c++ 【发布时间】:2011-10-09 18:08:32 【问题描述】:

我用 C++ 创建了一个 VCL 应用程序,borland。在我的项目中有一个文件,我在其中定义的方法中实现了嵌入式 python(我的应用程序包含一个按钮,该按钮调用实现嵌入式 python 的方法)。当我编译时,我的构建是成功的。但是当我运行我的应用程序并单击按钮时,它会显示运行时错误:“模块'PYTHON25.DLL'中地址1E091375的访问冲突。读取地址00000004”。请帮忙。 我以前从未使用过 Python。 我的程序:

#pragma hdrstop

#include <fstream>
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


#include "Python.h"

#include "Unit1.h"
#include "Unit2.h"
#pragma link "python25_bcpp.lib"

//---------------------------------------------------------------------------

#pragma package(smart_init)

bool callHelloWorld(int intVal)

    char fName[] = "Hello"; //file name
    char cFunc[] = "hello"; //method name

    char *pfName, *pcFunc;

    PyObject *pName, *pModule, *pDict, *pFunc ;

    pfName = fName;
    pcFunc = cFunc;

    Py_Initialize();

    pName = PyString_FromString(pfName);

    pModule = PyImport_Import(pName);

    pDict = PyModule_GetDict(pModule);

    pFunc = PyDict_GetItemString(pDict, pcFunc);

    if (PyCallable_Check(pFunc))
    
        PyObject_CallObject(pFunc, NULL);
     else
    
        PyErr_Print();
    


    // Py_DECREF(pModule);
    // Py_DECREF(pName);

    Py_Finalize();

    return 0;

【问题讨论】:

我似乎记得 Borland C++ 使用不同的调用约定(fastcall?)。你的 python.dll 是用同一个编译器编译的吗? python25.dll 位于 C:\Windows\SysWOW64。我没有编译它。 我不知道这是否有帮助,但我认为您缺少一些 python 文件。我记得尝试在另一台机器上编译我的程序时遇到同样的错误。但在我的情况下,我使用的是 MFC 程序,并且正在使用 python 脚本访问我的 MFC DLL。可能尝试重新安装python。 我已将 .h 、lib 和 .dll 等所有文件放在源文件夹中。我认为问题在于加载模块 Hello.py。您能否建议我应该如何成功加载模块。 它不会是调用约定,因为python.h 将指定 cdecl。为了帮助我们,你能告诉我们哪条线失败了。 【参考方案1】:

检查PyImport_Import(模块在搜索路径中吗?)和PyDict_GetItemString的返回值。

如果这无助于在您的应用中放置一些跟踪消息以查看它崩溃的位置。

【讨论】:

【参考方案2】:

这对我有用:

只需删除 Py_Finalize()

我在另一个网站上看到 Py_Finalize 在线程等特定情况下存在一些问题。

【讨论】:

以上是关于在 C++ 中嵌入 python的主要内容,如果未能解决你的问题,请参考以下文章

在 Python GUI 中嵌入 C++ 程序

在 C++ 中嵌入 python

在 C++ 中嵌入 Cython

在 C++ 中嵌入 Lua

在 C++ VS2015 中嵌入 Python

在 C++ 中嵌入 Python 时链接到啥