7

我有兴趣尝试在我的应用程序中嵌入 Python,让用户在应用程序环境中运行 Python 脚本,访问内部(C++ 实现)对象等。我对此很陌生,所以不知道到底是什么我正在做。

我读过Embedding Python in Another Application,虽然这似乎只谈论 C API 和平面 C 函数,而不是类或对象(除非我错过了什么),而且它的“在 C++ 中嵌入 Python”部分只有两句话长. 但是,我也遇到了如何使用 boost::python,这看起来很棒。

有一个问题: C++ Builder 2010 不支持boost::python 。

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

注意:我实际上使用的是 RAD Studio,它包括 C++ Builder 和 Delphi。可能可以使用某种特定于 Delphi 的绑定,但我遇到的那些是六七岁,或者是新的(Python 2.6)但似乎没有任何文档并且有问题列表中的评论,例如“任何人都读过这些 [原文如此] 评论?有人在这个项目上工作吗?”这并不令人鼓舞。但请随意包含特定于 Delphi 的答案,特别是如果您认为它们可能会在 D+CB 组合应用程序中工作。我感谢所有答案,即使它们不是很完美 - 我可以研究,我只需要关于去哪里的指针。不过,本机 C++ 解决方案可能是理想的,因为使用 VCL 派生的对象有其自身的局限性。

感谢您的输入!

4

3 回答 3

8

你不应该害怕谷歌小组的 P4D 项目。它似乎不活跃,部分原因是它已经非常稳定且功能齐全。这些组件用于更活跃的PyScripter应用程序,它是目前可用的最好的 Python 开发编辑器之一。PyScripter 是用 Delphi 编写的,并使用 P4D 组件。因此,它还提供了一个关于如何使用 P4D 组件的非常全面的示例,尽管 P4D 源代码检查提供的示例已经足以开始使用。

于 2010-08-10T09:42:17.153 回答
1

将内部类或实例化对象作为对象暴露给 Python 是否容易,或者 API 是真正的 C 风格还是平面/非 OO,如果是这样,通过这样的 API 模仿底层 OO 层的最佳方法是什么?

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

编译后,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 )
于 2010-08-10T08:48:08.813 回答
0

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

于 2010-08-10T11:24:41.890 回答