我正在尝试将Python嵌入Windows的C++Builder应用程序中。
经过对这个主题的多次研究(例如),我发现Python4Delphi项目看起来非常有趣,正是我想要做的。问题是我没有使用Delphi(我真的不想使用它),而是只使用C++Builder。
我还发现了一些将Python嵌入C++项目的示例(示例),所以我正在尝试这种方法。问题是我甚至不能编译第一个简单的"你好世界"实例
以下是我遵循的步骤:
- 在C++构建器中创建一个新的控制台应用程序项目
- 包括Python.h文件
- 编译以下代码:
#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)
安装和测试步骤:
-
在GitHub上获得Python4Helphi的最新版本(https://github.com/pyscripter/python4delphi)。将其解压缩到我的项目文件夹中。
-
已打开Python_D.dproj包项目。
-
将Delphi编译器的项目选项|C/C++输出文件生成选项设置为生成所有C++编译器文件(包括包库)
-
构建并安装Delphi4Python组件
-
打开Demo1 Delphi项目并对其进行测试,以确保组件和Python正常工作。C: \Users\david\Documents\Embarcadero\Studio\Projects\Python4Helphi\Python4Delphi master\Demos\Demo01
-
创建了一个新的C++Builder VCL应用程序。复制了Delphi Demo01表单中的所有组件。
-
为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);}}
-
做了一个项目——当被问及头文件和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
- 运行Demo1 C++版本,可以放入Python脚本代码并成功测试:D
我会写一篇博客文章,在那里我可以放屏幕截图和源代码链接。
目前还没有在任何地方安装C++BUilder 2020。我认为你应该能够使用C++Builder附带的Delphi命令行编译器,但必须尝试一下——我在不同的机器上有RAD Studio 10.4和RAD Studio 10.4.1。