我花了几天的时间试图找出如何使用我拥有的一堆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应用程序。
与往常一样,第一个问题是:我在这里遗漏了一些明显的东西吗? 如果没有,你的建议是什么? 感谢
答案 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