【发布时间】:2011-03-23 10:24:53
【问题描述】:
我目前正在为用户添加使用 python 脚本插件扩展我的桌面应用程序 (C++) 功能的功能。
天真的方法很简单。嵌入 python 静态库并遵循散布在网络上的数十个教程中的任意数量,这些教程描述了如何初始化和调用 python 文件,您就大功告成了。
不过……
我正在寻找的更像是 Blender 所做的。 Blender 可以通过 python 脚本完全定制,它需要一个 external python 可执行文件。 (即,python 实际上根本没有嵌入 在 blender 可执行文件中。)因此,自然地,当您编写 blender 脚本时,您可以在 site-packages 目录中包含您已经拥有的任何模块。不建议这样做,因为这会限制脚本的可移植性。
所以,我想知道是否已经有一种方法可以让你的蛋糕也可以吃。我想要一个插件系统,它使用:
-
嵌入式 python 解释器。
Blender 方法的缺点是它迫使您在系统上全局安装特定的、可能已过时的 python 版本。拥有一个嵌入式解释器可以让我控制正在使用的 python 版本。
-
防火墙插件。
每个插件都有一个
virtualenv;允许他们安装他们需要或想要的所有模块,但将它们与其他插件中可能发生的冲突分开。也许zc.buildout在这里是一个更好的候选人,但是,我再次非常愿意接受建议。对于实现这一目标的最佳方法,我有点不知所措。 -
尽可能无痛...
为用户。我愿意加倍努力,只要以上大部分内容对插件编写者尽可能透明。
如果你们中的任何人对这类事情有任何经验,我们将不胜感激。 :)
编辑:
基本上,我想要的简短版本是 virtualenv 的简单性,但没有捆绑的 python 解释器,以及一种以编程方式激活特定“虚拟环境”的方法,例如 zc.buildout 使用 sys.path 操作(@ 987654326@技巧)。
virtualenv 和 zc.buildout 都包含我想要的部分内容,但都不会生成我或插件开发人员可以简单地压缩并发送到另一台计算机的可重定位版本。
简单地操作 .pth 文件,或直接在脚本中操作 sys.path,从我的应用程序中执行,我就成功了。但是当需要编译模块时,例如 PIL 是不够的。
【问题讨论】:
-
当您提到
virtualenv时,您是否暗示您想让插件作者轻松构建外部模块?毕竟,如果您只是为每个插件提供自己的sys.path条目,并在插件加载之前在该插件的解释器中预构建,那么它们很有可能毫无困难地打包大多数纯 Python 模块。 -
也许我是在寻求月球,但如果有一种方法来捆绑编译的模块,比如 PIL,就像你描述捆绑纯 python 模块的方式一样,那就太好了。跨度>
-
这里不完全是问题的答案,但我根本不会嵌入 Python。为什么要限制自己使用一种脚本语言?而是使用 COM、DBUS 或其他远程调用协议公开脚本 API,并将 Python 写入该 API。
标签: c++ python scripting plugins desktop-application