繁体   English   中英

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

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

我正在编写一个应该能够在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. 从我的通用控制器实现插件以执行自定义插件的最简单方法是什么?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM