为Python独立可执行文件创建插件

5
如何为使用pyInstaller、py2exe或类似工具创建的独立可执行文件创建一个良好的插件引擎?
我没有使用过py2exe,但是pyInstaller使用导入钩子从其压缩存储库中导入软件包。当然,我可以动态地导入另一个使用pyInstaller创建的压缩存储库并执行代码——这可能是一个简单的插件引擎。
问题出现在插件(即动态导入的内容)使用原始存储库中不存在的库时。这是因为导入钩子是为原始应用程序而设计的,并且在原始存储库中搜索软件包,而不是稍后导入的存储库(插件包存储库)。
有没有一种简单的方法来解决这个问题?也许存在这样的引擎?
2个回答

3
当编译为exe时,你会遇到这个问题。
我能想到的唯一选项是将所有库都包含在exe软件包中,以允许用户使用他们的插件来使用任何Python库。
最好将支持的库限制为子集,并在文档中列出。这取决于你。
我只用过py2exe。
在py2exe中,你可以在setup.py文件中指定未在搜索中找到的库。
以下是一个示例:
from distutils.core import setup
import py2exe

setup (name = "script2compile",
       console=['script2compile.pyw'],
       version = "1.4",
       author = "me",
       author_email="somemail@me.com",
       url="myurl.com",
       windows = [{
                    "script":"script2compile.pyw",
                    "icon_resources":[(1,"./ICONS/app.ico")]  # Icon file to use for display
                 }],
       # put packages/libraries to include in the "packages" list
       options = {"py2exe":{"packages": [   "pickle",
                                            "csv",
                                            "Tkconstants",
                                            "Tkinter",
                                            "tkFileDialog",
                                            "pyexpat",
                                            "xml.dom.minidom",
                                            "win32pdh",
                                            "win32pdhutil",
                                            "win32api",
                                            "win32con",
                                            "subprocess", 
                                        ]}} 

       )

import win32pdh
import win32pdhutil
import win32api

1

PyInstaller 确实具有处理隐藏导入的插件系统,并且已经附带了几个。请参阅网页(http://www.pyinstaller.org),其中写道:

PyInstaller 的主要目标是与第三方软件包兼容。这意味着,使用 PyInstaller 时,所有使外部软件包正常工作所需的技巧都已经集成在 PyInstaller 中,因此不需要用户干预。您将永远不需要在维基百科中寻找技巧并对文件或设置脚本进行自定义修改。请查看我们支持的软件包的兼容性列表。


我正在考虑为我的独立应用程序开发插件系统。我使用pyInstaller创建了该应用程序。我想为此应用程序创建插件。问题在于,当插件导入原始应用程序中未导入的内容时,导入会失败。 - uhz
通常最好的情况是:
  • 插件不包含二进制应用程序中已经存在的模块
  • 插件包含应用程序中不存在的模块
  • 导入首先尝试从主应用程序导入,如果失败则从插件模块导入
- uhz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接