如何在C++Builder 2010(而非Delphi)应用程序中嵌入Python



我正在尝试将Python嵌入Windows的C++Builder应用程序中。

经过对这个主题的多次研究(例如),我发现Python4Delphi项目看起来非常有趣,正是我想要做的。问题是我没有使用Delphi(我真的不想使用它),而是只使用C++Builder。

我还发现了一些将Python嵌入C++项目的示例(示例),所以我正在尝试这种方法。问题是我甚至不能编译第一个简单的"你好世界"实例

以下是我遵循的步骤:

  1. 在C++构建器中创建一个新的控制台应用程序项目
  2. 包括Python.h文件
  3. 编译以下代码:
#pragma hdrstop
#pragma argsused
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <stdio.h>
#include <conio.h>
#include <Python.h>
int main()
{
PyObject* pInt;
Py_Initialize();
PyRun_SimpleString("print('Hello World from Embedded Python!!!')");
Py_Finalize();
printf("nPress any key to exit...n");
if(!_getch()) _getch();
return 0;
}

在编译过程中,我多次收到以下错误:

〔bcc32c错误〕pymath.h(22):声明与已在作用域中使用声明的目标冲突。

例如,当编译pymath.h中的第22行时会发生这种情况:

#ifndef HAVE_ROUND
extern double round(double);
#endif

我认为这可能是因为编译器和/或pyconfig.h配置。作为一个C++初学者和这个东西之王,我很难解决这个问题。

你能帮我吗?你有什么建议吗?

编辑

自2020年4月以来,C++Builder似乎支持Boost库,该库可用于在C++程序中实现Python。因此,以前的错误不再出现,相反,我有一个不同的错误。

使用与以前相同的脚本,但使用#include <boost/Python.hpp>,我出现错误:

[ilink32错误]致命:无法打开文件"LIBBOOST_YTHON38-BCB32C-MT-S-X32-1_68.LIB">

你有解决这个问题的想法吗?

根据Python文档,支持Borland编译器。

因此,目前,唯一的方法是恢复使用";经典Borland编译器";在";项目选项>建筑>C++编译器";选项卡

然后,您需要从安装提供的dll中创建OMF兼容的库,并将它们添加到项目中:

implib -aa python3.lib python3.dll
implib -aa python39.lib python39.dll

如果你得到一个链接器错误:

[ilink32 Error] Error: Unresolved external '__Py_RefTotal' referenced from ...
[ilink32 Error] Error: Unresolved external '__Py_NegativeRefcount' referenced from ...

您需要修改包含文件pyconfig.h:

#ifdef _DEBUG
//#       define Py_DEBUG  <<--- comment this!!
#endif

我在Python4Help中使用了C++Builder 10.4。

我安装了Python for Windows:

Python版本3.8.2(tags/v3.8.2:7b3ab59,2020年2月25日,22:45:29)[MSC v.1916 32位(英特尔)]版本信息。系统版本信息(主要=3,次要=8,微观=2,发布级别="最终",序列=0)

安装和测试步骤:

  1. 在GitHub上获得Python4Helphi的最新版本(https://github.com/pyscripter/python4delphi)。将其解压缩到我的项目文件夹中。

  2. 已打开Python_D.dproj包项目。

  3. 将Delphi编译器的项目选项|C/C++输出文件生成选项设置为生成所有C++编译器文件(包括包库)

  4. 构建并安装Delphi4Python组件

  5. 打开Demo1 Delphi项目并对其进行测试,以确保组件和Python正常工作。C: \Users\david\Documents\Embarcadero\Studio\Projects\Python4Helphi\Python4Delphi master\Demos\Demo01

  6. 创建了一个新的C++Builder VCL应用程序。复制了Delphi Demo01表单中的所有组件。

  7. 为3个按钮添加了事件处理程序:

    void __fastcall TForm2::按钮单击(对象*发件人){Python引擎1->ExecStrings(内存1->行);}//---------------------------------------------------------------------------

    void __fastcall TForm2::按钮单击(对象*发件人){if(OpenDialog1->Execute()){备忘录1->行->LoadFromFile(OpenDialog1->FileName);}}//---------------------------------------------------------------------------

    void __fastcall TForm2::按钮3单击(对象*发件人){if(SaveDialog1->Execute()){备忘录1->行->保存到文件(SaveDialog1->FileName);}}

  8. 做了一个项目——当被问及头文件和lib文件在哪里时,我把它们指向了哪里(你也可以更新项目的搜索目录)。

PythonEngine.hpp-C:\Users\david\Documents\Embarcadero\Studio\Projects\Python4Helphi\Python4Delphi master\Source

Python_dbi、Python_dcp、Python-D.lib-C:\Users\Public\Documents\Embarcadero\Studio\21.0\dcp

  1. 运行Demo1 C++版本,可以放入Python脚本代码并成功测试:D

我会写一篇博客文章,在那里我可以放屏幕截图和源代码链接。

目前还没有在任何地方安装C++BUilder 2020。我认为你应该能够使用C++Builder附带的Delphi命令行编译器,但必须尝试一下——我在不同的机器上有RAD Studio 10.4和RAD Studio 10.4.1。

最新更新