使用 Python 插件可扩展性编写跨平台应用程序的最简单方法

Simplest way to write cross-platform application with Python plugin extensibility?

本文关键字:应用程序 最简单 方法 跨平台 Python 插件 可扩展性 使用      更新时间:2023-10-16

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

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

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

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

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

  1. 多个前端之间共享公共控制器代码的最简单方法是什么:

    a. Mac上的Objective-C?

    b. C++在Windows上?

    c. 来自 Linux/BSD 的 C/Python?

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

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

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

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

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

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

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