为Python独立可执行文件创建插件
如何为使用pyInstaller、py2exe或类似工具创建的独立可执行文件创建一个好的插件引擎?
我对py2exe没有经验,但pyInstaller使用一种叫做导入钩子的东西,从它的压缩库中导入包。当然,我可以动态地导入另一个用pyInstaller创建的压缩库并执行代码——这可能就是一个简单的插件引擎。
当插件(也就是动态导入的内容)使用一个在原始库中不存在的库时,就会出现问题(这个库从来没有被导入过)。这是因为导入钩子是针对原始应用程序的,它只在原始库中查找包,而不是后面导入的(插件包库)。
有没有简单的方法来解决这个问题?也许已经有这样的引擎存在?
2 个回答
1
PyInstaller 确实有一个插件系统,可以处理那些隐藏的导入,而且它自带了好几个这样的插件。你可以去它的官网看看,网址是 http://www.pyinstaller.org,上面说:
PyInstaller 的主要目标是能够直接兼容第三方包。这意味着,使用 PyInstaller 时,所有让外部包正常工作的技巧都已经集成在 PyInstaller 里,所以你不需要自己动手去调整。你永远不需要去维基上找技巧,也不用对你的文件或设置脚本进行自定义修改。可以查看我们支持的包的兼容性列表。
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