2010-08-10 80 views
7

我很想尝试在我的应用程序中嵌入Python,让用户在应用程序环境中运行Python脚本,访问内部(C++实现的)对象等等。我对此很陌生,所以不知道正是我在做什么。我看过Embedding Python in Another Application,虽然这似乎只是谈论一个C API和平面C函数,而不是类或对象(除非我错过了某些东西),它的“C++嵌入式Python”部分只有两句话长。但是,我也遇到过how to use boost::python,这看起来不错。我应该如何将Python嵌入到C++ Builder/Delphi 2010应用程序中?

有一个问题:boost :: python is not supported by C++ Builder 2010

因此,鉴于此,将Python嵌入到用C++ Builder 2010编译的C++应用程序中的最佳方法是什么,并且使用哪种技术最好,如何公开/整合类和对象以提供Python编码器访问程序的面向对象内部?我错过了一个标准的方法吗?将内部类或实例化对象暴露给Python,因为对象容易,或者API是真正的C风格还是平面/非OO,如果是的话,通过这样的API模仿底层OO层的最佳方法是什么?

注意:我实际上使用RAD Studio,它包括C++ Builder和Delphi。有可能使用某种特定于Delphi的绑定,但我遇到的那些是six or seven years old,或者是新ish(Python 2.6),但don't seem to have any documentation并且在问题列表中有如"Anyone reads thiese [sic] comments anyway? Anyone working on this project?"这样的评论,这不是令人鼓舞的。但是,请随意包含特定于Delphi的答案,特别是如果您认为它们可能会在D + CB组合应用程序中工作。即使他们不完美,我也很感激所有的答案 - 我可以研究,我只需要指出去哪里。然而,本地C++解决方案可能是理想的,因为使用VCL派生的对象有其自身的局限性。

感谢您的输入!

回答

8

您不应该害怕谷歌组的P4D项目。它看起来不活跃,部分原因是它已经非常稳定且功能全面。这些组件被用在更为活跃的PyScripter应用程序中,该应用程序是当前可用的最好的Python开发编辑器之一。 PyScripter是用Delphi编写的,使用P4D组件。因此,它也提供了一个非常全面的例子,说明如何使用P4D组件,尽管P4D源代码结账提供的示例已经足够好,可以开始使用。

+1

好的,谢谢。我没有从它的网站上知道它的稳定性。 – 2010-08-16 02:29:57

1

是暴露的内部类或 实例化对象Python作为 对象容易,或者是API真正 C风格或平/非面向对象的,如果是这样 什么是最好的方式来模仿 底层OO层通过这样一个 API?

你已经回答了你自己。这句话的后半部分是正确的。

只要编译时,对象和类就不存在于C++中,只有少数结构(vtables),还有另一些解释一些OO数据,前提是RTTI被激活。这就是为什么使用类和对象来弥补Python和C++之间的差距的原因。

您可以自己构建它,创建一组C函数以及一些数据结构,然后创建一个OO层。但是你不能那样做。

例如,类车:

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) 
+0

谢谢......我的确知道这大概是通常如何实现OO :)所以你基本上说要通过传递这个/自己到处来重新创建一个OO类接口?似乎可怕的笨拙:( – 2010-08-16 02:31:14

+0

是的,它是笨拙的,虽然它是如何实现的。是的,如果你打算建立自己的OO接口,你应该处理所有这些。除了使用另一个现有的接口之外没有别的选择。 – Baltasarq 2010-08-16 13:22:37

+0

那么,使用另一个接口是我所问的,我不想重新创建Python/CPP钩子 - 如果有一个我可以用于编译器的现有框架,那就是我所追求的。我必须重新创建一切,我将简单地使用另一种语言,因为它有更好的支持! – 2010-08-24 23:52:36

0

您可以使用swig生成C++到$ SCRIPTLANG包装。

相关问题