0

我正在编写一个应用程序,它应该能够在 Linux、Mac OS X、Windows 和 BSD 上运行(不一定作为单个可执行文件,所以它不必是 Java)并且可以使用简单的插件进行扩展。

我希望我的插件实现的方式是作为一个简单的 Python 程序,它必须实现某个功能并简单地将字典返回到主程序。

插件安装应该只是将插件脚本文件复制到./plugins相对于主可执行文件的目录中。

主程序应该是在上述所有平台之间共享代码的独立可执行文件,但具有特定于平台的前端(因此 Linux 和 BSD 版本只是 CLI 工具,Windows 版本具有 C++ 和 MFC 前端,而 Mac OS X 版本将具有 Objecive-C 和 Cocoa 前端)。

所以我想这实际上是两个问题:

  1. 在多个前端之间共享通用控制器代码的最简单方法是:

    一种。Mac上的Objective-C?

    湾。Windows 上的 C++?

    C。来自 Linux/BSD 的 C/Python?

  2. 从我的通用控制器实现插件以执行自定义插件的最简单方法是什么?

4

2 回答 2

2
  1. 我和fontanini在这里;为控制器逻辑使用共享库 (DLL)。最好使用 C/C++,并小心使用 RTTI(需要 dynamic_cast<> 和异常处理),它可能无法跨 DLL 边界工作(例如,您可能无法从另一个 DLL 中捕获抛出的异常)。

    寻找像 Qt 这样的优秀跨平台库,它以与平台无关的方式提供了很多功能(例如文件系统、进程、网络——不仅仅是 GUI,无论如何你都想单独开发它们)。

  2. Python/C API是使Python 可以使用 C/C++ 功能的基础(反之亦然),扩展模块和为嵌入式 Python 解释器提供自己的功能的程序之间只有很小的区别。

    但是,您可能希望使用包装器生成器(所有这些都基于 Python API,但比直接使用它需要更少的代码),让您的生活更轻松。例子是:

    • boost::python(非常方便和强大,但是有一个难以理解的硬核-C++ 实现;-),并且由于过多的模板使用导致更大的目标代码),可能使用pyplusplus直接生成 boost::python 包装器代码从您的头文件中(不牺牲调整结果的可能性,例如排除或修改函数签名)
    • SIP(特别是与 [Py]Qt 结合使用)
    • Swig(适用于多种脚本语言,但会导致 API 反映 C API 被包装而不是“pythonic”)
    • PyBindGen基于与 pyplusplus 相同的 GCCXML 后端,但直接生成纯 Python/C API 代码,从而实现更精简的绑定(但可能无法立即了解所有代码)
于 2012-04-26T11:25:30.413 回答
0
  1. 共享应用程序的跨平台 Python 组件的最简单方法可能是将其实现为命令行程序,然后使用每个前端中的相关系统调用来调用它。这不是最强大的方法,但它可能就足够了。

  2. 如果您希望插件只是一个包含 Python 代码的文件,我建议它们至少符合约定,例如通过扩展一个类,然后让您的代码使用“import plugin_name”将它们加载到 Python 运行时。这比将插件作为单独的程序存在要好,因为您将能够以 Python 类型访问输出,而不需要从标准输入中解析文本。

于 2012-04-20T11:30:08.653 回答