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

时间:2017-02-02 14:29:47

标签: 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的操作,因为每当我执行应用程序崩溃时都会引发以下异常:

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

似乎很清楚,系统范围内缺少正确的安装会导致注册表调用中断(现在在win上测试),但不幸的是我不太熟悉CType(或者用于绑定到ImageMagick库的任何东西) )我不知道如何正确构建一个no-deps应用程序。

与往常一样,第一个问题是:我在这里遗漏了一些明显的东西吗? 如果没有,你的建议是什么? 感谢

1 个答案:

答案 0 :(得分:2)

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

<强> MAGICK_HOME

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

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

非常轻微,但有帮助。

.dll&#39>等

请记住,IM是它自己的生态系统。确实wand只需要MagickWand&amp;要运行MagickCore个库,但IM需要所有代理/编码器都有用。确保所有内容都存在,然后仔细检查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

policy.xml下的文件CONFIGURE_PATH非常适合包含,以确保您的应用程序能够防范ImageTragick