如何在C++ Builder / Delphi 2010应用中嵌入Python?
我想尝试在我的应用程序中嵌入Python,这样用户就可以在应用环境中运行Python脚本,访问一些内部的(用C++实现的)对象等等。我对这方面还很陌生,所以不太清楚自己在做什么。
我看过了在其他应用中嵌入Python的文档,不过里面似乎只讲了C语言的API和一些简单的C函数,没有涉及到类或对象(除非我漏掉了什么),而且它关于“在C++中嵌入Python”的部分只有两句话。不过,我还发现了如何使用boost::python,看起来非常不错。
但有一个问题:boost::python 不支持C++ Builder 2010。
所以,考虑到这一点,在用C++ Builder 2010编译的C++应用中嵌入Python的最佳方法是什么?使用哪种技术最合适,如何将类和对象暴露给Python,让Python开发者能够访问程序的面向对象内部呢?我是不是漏掉了什么标准的方法?将内部类或实例化对象暴露给Python作为对象是否简单,还是说API真的像C语言那样,比较简单而不面向对象?如果是这样,怎样才能通过这样的API模拟一个底层的面向对象层呢?
注意:我实际上使用的是RAD Studio,它包括C++ Builder和Delphi。可能可以利用某种特定于Delphi的绑定,但我遇到的那些绑定要么是六七年前的,要么是比较新的(Python 2.6),但似乎没有任何文档,而且在问题列表中有评论像“有人在看这些评论吗?这个项目有人在做吗?”,这让人不太有信心。不过,如果你认为Delphi特定的解决方案可能在结合D+CB的应用中有效,请随意分享。我很感激所有的回答,即使它们不是完美的——我可以自己研究,只需要一些指引。虽然一个原生的C++解决方案可能是理想的,因为使用VCL派生的对象也有自己的限制。
谢谢你的建议!
3 个回答
你可以使用swig这个工具来生成C++和$SCRIPTLANG之间的连接代码。
把内部类或者实例化的对象直接暴露给Python,作为对象使用,这个简单吗?还是说这个API更像C语言那样,比较平坦、不面向对象?如果是这样的话,怎么才能通过这样的API来模拟一个面向对象的层呢?
你自己已经回答了这个问题。后半部分是对的。
在C++中,一旦你编译了代码,类和对象就不存在了,只有一些结构(比如虚表),还有一些其他的东西来解释一些面向对象的数据,前提是你开启了RTTI(运行时类型信息)。这就是为什么用类和对象来连接Python和C++是行不通的。
不过,你可以自己动手来实现,创建一组C语言的函数和一些数据结构,然后再加上一个面向对象的层。但这不是开箱即用的。
比如,类Car:
class Car {
public:
int getDoors()
{ return this->doors; }
protected:
int doors;
};
会被转换成:
struct Car {
int doors;
};
int Car_getDoors(Car * this)
{
return this->doors;
}
而调用getDoors:
c->getDoors()
会被转换成:
Car_getDoors( c )
你不用担心谷歌小组里的P4D项目。看起来这个项目不太活跃,部分原因是它已经非常稳定,功能也很齐全了。这些组件被用在一个更活跃的应用程序PyScripter中,PyScripter是目前最好的Python开发编辑器之一。PyScripter是用Delphi编写的,并且使用了P4D的组件。因此,它也提供了一个很全面的示例,展示了如何使用P4D的组件,虽然P4D源代码中的示例已经足够让你入门了。