【问题标题】:PyInstaller + Wand (ImageMagick) - missing dependenciesPyInstaller + Wand (ImageMagick) - 缺少依赖项
【发布时间】:2017-02-02 14:29:47
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: python imagemagick pyinstaller wand


    【解决方案1】:

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

    MAGICK_HOME

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

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

    非常轻微,但有帮助。

    .dll 等

    请记住,IM 是它自己的生态系统。确实,wand 只需要 MagickWandMagickCore 库即可运行,但 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
    

    CONFIGURE_PATH 下的文件 policy.xml 非常适合包含以确保您的应用程序免受 ImageTragick 的影响

    【讨论】:

    • 谢谢。对整个 IM 包的非常有趣的见解引发了我的一些额外研究。不幸的是,我还没有完全弄清楚如何正确地进行导入,甚至连“最后的尝试”都没有成功:我硬编码了一些 winreg 键,以便在机器上找不到 IM 时设置,然后将整个 IM 安装目录包含到构建中 - 但仍然没有满足依赖关系。
    猜你喜欢
    • 1970-01-01
    • 2017-12-25
    • 2015-04-18
    • 2020-03-24
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多