在C++中嵌入Python

4 投票
2 回答
1138 浏览
提问于 2025-04-17 03:59

我在Borland的C++中创建了一个VCL应用程序。在我的项目中,有一个文件里我实现了嵌入式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;
}

2 个回答

1

这个方法对我有效:

只需删除 Py_Finalize() 这一行。

我在其他网站上看到,Py_Finalize 在某些特定情况下,比如多线程时,会出现一些问题。

1

检查一下 PyImport_Import 的返回值(这个模块在搜索路径里吗?)和 PyDict_GetItemString 的返回值。

如果这样还不行,可以在你的应用里加一些调试信息,看看程序崩溃的地方在哪里。

撰写回答