使用非系统 Python 在 pyenv 中使用 py2app 构建的应用程序无法在其他机器上运行

App built with non-system Python using py2app in pyenv not runnable on other machines

我的理解是,只要使用非 Apple-default Python 来构建,最终用户就不需要安装 Python him/herself 来执行 py2app -内置的应用程序。在我自己的环境中开发和测试应用程序时,我显然安装了 Python。具体来说,我内置了 pyenv 和 python.org 安装,而不是 Apple 自己的。然而,当我将该应用程序提供给未安装 Python 的最终用户时,她得到:

A Python runtime could not be located. You may need to install a framework build of Python, or edit the PyRuntimeLocations array in this application's Info.plist file.

第二行是关于;如果它所说的是真的,那么需要为最终用户安装的每个可能位置构建一个单独的应用程序实例,例如 /usr/bin/Library/Frameworks

更新: Info.plist 定义:

    <key>PythonExecutable</key>
<string>/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python</string

然而,有问题的最终用户只在 /usr/bin 中安装了系统。

这是否意味着每个最终用户都需要有一个外部安装的 Python,并且它必须位于 /Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python

如果他们没有非 Apple Python 怎么办?如果他们有一个非 Apple Python 但不是 2.6 怎么办?如何避免这种有点硬编码的依赖关系?

如果

py2app 认为您正在使用系统解释器,它会自动默认为 --semi-standalone 模式。您来自 Python.org 的解释器不应算作 "system" 解释器,但您可以使用此命令查看 py2app 的想法:

$ python -c "import py2app.build_app; print py2app.build_app.is_system()"
False

需要注意的一个问题:我今天安装了 Python.org 解释器后,bash 没有更新它的 hash 缓存,导致我启动时出现奇怪的不兼容问题 python.我必须输入 hash -r python 来重置缓存并确保使用正确的 python 版本。 (解决此问题的另一种方法是注销并重新登录。)我想同样的问题可能导致 py2app 对您是否正在使用系统 python 感到困惑。

如果这不起作用,请尝试将您的 python 解释器安装到一个奇怪的位置,例如 ~/mypython 或类似的位置,只是为了确保它不可能对系统感到困惑 python.

作为最后的手段,我想你可以破解 py2app 源代码,这样 is_system() 总是 returns False。不过不确定这是否会产生任何不良后果。

PS -- 这是一个关于使用 py2appconda 打包应用程序的小教程: https://github.com/stuarteberg/helloworld 此处与您的问题不完全相关,但您可以将其与您自己的设置进行比较并寻找任何明显的差异。