python - PyInstaller + Wand (ImageMagick) - 缺少依赖项

标签 python imagemagick pyinstaller wand

在过去的几天里,我一直在尝试弄清楚如何用我拥有的一堆 Python3.4 脚本构建一个无 dep 的应用程序。其中包括进口 wand ,这需要ImageMagick要安装在机器上。
到目前为止,一切顺利,从源代码运行的应用程序在我的开发环境(Debian8/Win10)中运行良好,找到了 Wand 模块正常运行所需的所有依赖项。

当我尝试使用 PyInstaller 打包应用程序时,出现了问题。
构建过程按预期工作,获取 ImageMagick 资源( .dll 等)并将它们与其他二进制文件一起包含在输出目录中,但是当我在没有安装 IM 库的计算机上运行应用程序时,导入失败。

所以我深入研究了 Wand 源代码,并意识到依赖项是在全局系统路径(即 C:\ProgramFiles)中查找的。作为解决方法,在我的代码中,我只是覆盖了 os.environ['MAGICK_HOME']变量为 './'指示模块获取适当的依赖项。在某种程度上,它确实有效。

现在我可以启动应用程序:导入不会失败,GUI 已绘制且功能不受影响。至少在我触发任何涉及魔杖的操作之前不会,因为每当我执行该操作时,应用程序都会崩溃并引发以下异常:

wand.exceptions.ConfigureError: RegistryKeyLookupFailed `CoderModulesPath' @ error/module.c/GetMagickModulePath/666

很明显,系统范围内缺乏正确的安装会导致注册表调用损坏(现在在 win 上进行测试),但不幸的是我不太熟悉 CTypes(或用于绑定(bind)到 ImageMagick 库的任何内容) )并且我不确定如何继续正确构建无依赖应用程序。

一如既往,我脑海中浮现的第一个问题是:我是否在这里遗漏了一些明显的东西?
如果没有,您有什么建议?
谢谢

最佳答案

这更多的是评论,而不是真正的答案,但我建议以下......

MAGICK_HOME

设置 MAGICK_HOME 环境变量是明智的做法。 但是我建议使用os.path来解析系统绝对路径;而不是相对。

os.environ['MAGICK_HOME'] = os.path.abspath('.')

非常小,但有帮助。

.dll 等

请记住,IM 是它自己的生态系统。确实,wand 只需要 MagickWandMagickCore 库即可运行,但 IM 需要所有委托(delegate)/编码器才能发挥作用。确保一切都存在,并仔细检查 QuickStart.txt .

在您的构建系统上,可能值得检查 identify 实用程序,以查看 PyInstallers 捆绑阶段应包含的其他路径。

identify -list Configure | grep PATH

在我的 Mac 上,我收到以下信息...

CODER_PATH     /usr/local/lib/ImageMagick-6.9.5/modules-Q16/coders
CONFIGURE_PATH /usr/local/etc/ImageMagick-6/
DOCUMENTATION_PATH /usr/local/share/doc/ImageMagick-6
EXECUTABLE_PATH /usr/local/bin
FILTER_PATH    /usr/local/lib/ImageMagick-6.9.5/modules-Q16/filters
INCLUDE_PATH   /usr/local/include/ImageMagick-6
LIBRARY_PATH   /usr/local/lib/ImageMagick-6.9.5
SHARE_PATH     /usr/local/share/ImageMagick-6
SHAREARCH_PATH /usr/local/lib/ImageMagick-6.9.5/config-Q16

CONFIGURE_PATH 下的policy.xml 文件是理想的包含内容,以确保您的应用程序免受 ImageTragick 的攻击。

关于python - PyInstaller + Wand (ImageMagick) - 缺少依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42004835/

相关文章:

python - PyInstaller 打包的应用程序在控制台模式下工作正常,在窗口模式下崩溃

python - 如何在 PyCharm 中为 flake8 启用自动代码格式化

python - 使用 b4 抓取时排除隐藏标签

ruby-on-rails - Rails 回形针 `is not recognized by the ' 识别'命令`

imagemagick - 使用 ImageMagick 从扫描图像自动修剪白色边框?

linux - 将多页 PDF 转换为单个图像

python - 为什么我们要为链表中的头节点创建不同的类?

python - 用 Pandas 计算每行中的非空值

python - 使 pyinstaller --onefile install 可移植

python - Pyinstaller 未加载 DLL