【问题标题】:How should I embed Python in a C++ Builder / Delphi 2010 application?我应该如何将 Python 嵌入到 C++ Builder / Delphi 2010 应用程序中?
【发布时间】:2011-03-27 16:24:43
【问题描述】:

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

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

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

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

注意:我实际上使用的是 RAD Studio,它包括 C++ Builder 和 Delphi。可能可以使用某种特定于 Delphi 的绑定,但我遇到的是 six or seven years old,或者是新的(Python 2.6)但 don't seem to have any documentation,并且在问题列表中有 cmets,如 @ 987654326@ 这并不令人鼓舞。但是请随意包含特定于 Delphi 的答案,特别是如果您认为它们可能会在 D+CB 组合应用程序中工作。我感谢所有答案,即使它们不是很完美 - 我可以研究,我只需要关于去哪里的指针。不过,原生 C++ 解决方案可能是理想的,因为使用 VCL 派生的对象有其自身的局限性。

感谢您的意见!

【问题讨论】:

    标签: python delphi embed c++builder c++builder-2010


    【解决方案1】:

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

    【讨论】:

    • 好的,谢谢。我没有从它的网站上意识到它这么稳定。
    【解决方案2】:

    正在公开内部类或 将对象实例化为 Python 对象很容易,或者 API 是真的吗 C 风格或平面/非 OO,如果是这样 模仿的最佳方法是什么 底层OO层通过这样一个 API?

    您已经回答了自己。后半句是对的。

    只要激活 RTTI,C++ 中就不会存在对象和类,只有少数结构(vtables),以及解释一些 OO 数据的其他结构。这就是为什么使用类和对象无法弥合 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 )
    

    【讨论】:

    • 谢谢...我知道这大致是 OO 通常是如何实现的 :) 所以你基本上是在说通过到处传递 this/self 来重新创建一个类似 OO 的接口?看起来非常笨拙:(
    • 是的,它很笨拙,尽管它是如何实现的。是的,如果您计划构建自己的 OO 接口,则应该处理所有这些问题。除了使用另一个现有接口之外别无选择。
    • 嗯,我要问的是使用另一个界面。如果可能的话,我不想重新创建 Python / CPP 钩子——如果有一个现有的框架可以与我的编译器一起使用,那就是我所追求的。如果我必须重新创建所有内容,我只会使用另一种有更好支持的语言!
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 2010-09-08
      • 1970-01-01
      相关资源
      最近更新 更多