繁体   English   中英

如何在 C++ Builder 2010(不是 Delphi)应用程序中嵌入 Python?

[英]How to embed Python in a C++ Builder 2010 (not Delphi) application?

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

在对该主题( 示例)进行多次研究之后,我发现 Python4Delphi 项目似乎非常有趣,这正是我想要做的。 问题是我没有使用 Delphi(而且我真的不想使用它),而只使用 C++Builder。

我还找到了一些在 C++ 项目中嵌入 Python 的示例( 示例),所以我正在尝试这种方法。 问题是我什至无法编译第一个简单的“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):声明与作用域中已经存在的 using 声明的目标冲突。

例如,当编译pymath.h第 22 pymath.h ,就会发生这种情况:

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

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

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

编辑

自 2020 年 4 月起,C++Builder 似乎支持 Boost 库,可用于在 C++ 程序中实现 Python。 所以以前的错误不再出现,而是我有一个不同的错误。

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

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

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

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

我安装了适用于 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。

根据 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM