【问题标题】:How to embed Python in a C++ Builder 2010 (not Delphi) application?如何在 C++ Builder 2010(不是 Delphi)应用程序中嵌入 Python?
【发布时间】:2020-09-28 10:44:55
【问题描述】:

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

在对该主题 (example) 进行了多次研究之后,我发现 Python4Delphi 项目看起来非常有趣,并且正是我想要做的。问题是我没有使用 Delphi(我也不想使用它),而只是使用 C++Builder。

我还找到了一些将 Python 嵌入到 C++ 项目中的示例 (example),所以我正在尝试这种方法。问题是我什至无法编译第一个简单的“Hello world”示例。

这是我遵循的步骤:

  1. 在 C++ builder 中创建一个新的控制台应用程序项目
  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 &lt;boost/Python.hpp&gt;,我有错误:

[ilink32 错误] 致命:无法打开文件“LIBBOOST_PYTHON38-BCB32C-MT-S-X32-1_68.LIB”

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

【问题讨论】:

  • 问题是我没有使用 Delphi(我也不想使用它),而只是使用 C++Builder。” - 仅供参考,C ++Builder 包含一个 Delphi 编译器,因此您可以在 C++Builder 项目中使用 Delphi 组件/库。
  • 你是对的,Delphi 编译器就在那里。我同意使用 P4D 应该是可能的,但是,我的发行版中没有 Delphi,我什至无法打开“演示”文件来学习如何使用 P4D 并尝试使其与 C++ 项目一起工作(另外,我不完全知道如何在 Delphi 中编写代码)。
  • 您无需在 IDE 中打开 Delphi 项目 即可查看它们的源代码。但是,如果您至少不知道如何阅读 Delphi 代码,那么从长远来看,您可能很难在 C++Builder 中取得成功,因为大多数组件、演示、文档等可能应用于 C++Builder 仅针对 Delphi 编写。 C++Builder 与 Delphi 共享通用框架,并具有许多用于 Delphi 兼容性的编译器扩展。因此,对于任何 C++Builder 开发人员来说,至少对 Delphi 有一定的了解是一项相当重要的技能。

标签: python c++ c++builder


【解决方案1】:

我使用 C++Builder 10.4 和 Python4Delphi。

我安装了适用于 Windows 的 Python:

Python 版本 3.8.2(标签/v3.8.2:7b3ab59,2020 年 2 月 25 日,22:45:29)[MSC v.1916 32 位(英特尔)] 版本信息。 sys.version_info(major=3, minor=8, micro=2, releaselevel='final', serial=0)

安装和测试步骤:

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

  2. 打开 Python_D.dproj 包项目。

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

  4. 构建并安装了 Delphi4Python 组件

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

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

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

    void __fastcall TForm2::Button1Click(TObject *Sender) { PythonEngine1->ExecStrings(Memo1->Lines); } //------------------------------------------------ --------------------------

    void __fastcall TForm2::Button2Click(TObject *Sender) { if (OpenDialog1->Execute()) { Memo1->Lines->LoadFromFile(OpenDialog1->FileName); } } //------------------------------------------------ --------------------------

    void __fastcall TForm2::Button3Click(TObject *Sender) { if (SaveDialog1->Execute()) { Memo1->Lines->SaveToFile(SaveDialog1->FileName); } }

  8. 是否创建了一个项目 - 当被问及头文件和 lib 文件在哪里时,我将它们指向(您也可以只更新项目的搜索目录)。

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

Python_D.bpi、Python_D.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。

【讨论】:

    【解决方案2】:

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

    因此,目前唯一的方法是在“项目选项 > 构建 > C++ 编译器”选项卡中恢复使用“经典 Borland 编译器”。

    然后您需要从安装提供的 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
    

    【讨论】:

    • @user186876(伟大的大卫一世)感谢您为此付出的努力和建议! P4D 是一件很棒的事情,当然也是实现结果的好方法,但我同意 Tomasso:在某些情况下您“可以”使用 delphi 组件,但最好不要。毕竟,如果你需要包含的库是 C/C++ 库,为什么我的 C/C++ 编译器不应该直接嵌入它??
    猜你喜欢
    • 2011-03-27
    • 2014-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    相关资源
    最近更新 更多