【发布时间】:2020-09-17 13:50:32
【问题描述】:
我一直在将一个项目从 Python2.7 升级到 Python3.8,同时处理 MacOS Mojave 和 Catalina 上的部署/签名问题。
Python 应用是使用 Py2app 构建然后签名的,但签名时只有一个文件失败:
codesign --sign "${IDENTITY}" --entitlements ../entitleme.plist --deep "demo.app/" --force --options runtime
demo.app/: main executable failed strict validation
In subcomponent: /demo.app/Contents/Frameworks/liblzma.5.dylib
并且没有严格:
codesign --sign "${IDENTITY}" --entitlements ../entitleme.plist --deep "demo.app/" --no-strict --force --options runtime
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate: the __LINKEDIT segment does not cover the end of the file (can't be processed) in: demo.app/Contents/Frameworks/liblzma.5.dylib
demo.app/: the codesign_allocate helper tool cannot be found or used
In subcomponent: demo.app/Contents/Frameworks/liblzma.5.dylib
另一个问题here 表示 PyInstaller 或其他系统有类似的问题,这个incomplete solution 修复了它。但是,实际解决方案(如果找到)在编辑或链接材料的更改中显得难以理解。另外,我注意到codesign_allocate 被列为未找到,但它在路径中并且运行良好,所以我怀疑它在具有__LINKEDIT 段错误的文件上的使用是不好的。
似乎 liblzma 来自在 py2app 构建期间由库合并的压缩算法,并且尝试进行更新迄今为止没有结果——尽管我已经开始怀疑在最新的 MacOS 上重新编译源材料是否会纠正这些错误。
是否有解决此问题的已知途径?
【问题讨论】:
-
FWIW,lzma 现在是 python 标准库的一部分,因此包含在标准 python 解释器中。如果您使用 conda,则该库来自“xz”包。这是 conda-forge 的构建方法,以防万一:github.com/conda-forge/xz-feedstock/blob/master/recipe/…
-
你是如何安装你的python解释器的?如果你没有从 conda 得到它,也许试试看?如果你这样做了,也许尝试 conda-forge 而不是默认通道,反之亦然。希望有人正确地构建 liblzma。如果无论你的 python 解释器来自哪里都存在问题,那么它可能是 liblzma Makefile 本身的一个错误,因此应该在上游报告。 (希望不是这样。)
-
@stuartberg 到目前为止我的发现是正确的。我正在使用 pyenv,但我不确定来源,但发现 py2app 构建使用库的两个副本,从
/usr/local/opt/xz/lib/liblzma.5.dylib开始,从~/pyenv/versions/3.8.1/lib/python3.8/site-packages/PIL/.dylibs/liblzma.5.dylib开始,本地 xz 版本是来自 brew 的 8.5.0,而不是签名而python3.8,而另一个签名并且是8.4.0版本。我复制了 8.5.0,它可以工作。此外,我无法卸载 xz,因为它是其他重要事物的依赖项。当 py2app 更喜欢这个时,我很困扰。 -
FWIW,显然 xz-5.2.4 附带 liblzma.dylib 8.4.0,而 xz-5.2.5 使用 8.5.0。但是很难知道差异是由于版本还是由于使用的不同分布(brew vs. PIL packagers)。您的设置中存在两个的事实是 Python “wheel” 格式要求每个包提供自己的 dylib 的结果。如果您能够为您的应用创建 conda 环境,我认为值得一试。特别是如果您可以从 conda-forge 安装依赖项。
标签: python macos code-signing py2app