在以前版本的Mac OS上运行PyObjC应用程序(内置在Xcode中)?

时间:2013-07-29 07:41:25

标签: python xcode macos pyobjc

我正在使用Xcode构建PyObjC应用程序。该应用程序在构建计算机上运行正常(运行10.8),但在运行10.6的计算机上启动时崩溃,因为它无法找到Python 2.7安装。足够公平 - 预装的10.6上的Python是Python 2.5。但我真的不关心我的应用程序使用哪个Python版本,我只是想让它使用它可以找到的最新版本的Python。

我怎么能:

A)告诉我的应用程序使用主机系统上可用的最新版本的Python,或者

B)将整个Python源代码捆绑到我的应用程序中?

我对此问题感到非常沮丧,非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

好问题。几年前,我为了嵌入问题而努力解决这个问题,并最终动态链接到我知道在每个平台上都可用的特定版本。

我最初认为Python.framework的{​​{1}}就足够了,但它似乎在链接时由Xcode解决,因此使链接特定于特定版本。出于我的目的,我能够直接链接到

Current

适用于OS X 10.7和10.8。如果你需要回到10.6,你会想尝试链接到

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/Python

显然,如果你正在编译10.6 SDK,你会想要使用它,但关键是要确保你链接到版本特定版本的库而不是框架版本身。您应该可以通过 Link Binary with Libraries 中的 + 按钮手动导航到特定版本,但如果遇到问题,可以打开Python.framework SDK直接在Finder中将特定于版本的库拖到 Link Binary with Libraries 组中。

如果您找到解决方法,请在此处发布另一个答案,但这对我来说非常有效,可以将其嵌入到我的应用中。

答案 1 :(得分:0)

使用py2app创建应用程序包,并使用单独安装的Python(即不使用/System/Library/Framework/Python.framework)来执行此操作。您使用的python安装应该使用MACOSX_DEPLOYMENT_TARGET设置为您要支持的最低OSX版本进行编译。

执行此操作时,应该可以部署到较旧的OSX版本。我经常这样做是为了在10.8机器上构建应用程序,并将其部署到10.5机器上。

在包含其他库时,您需要特别小心,特别是当这些库包含配置脚本时:有时配置脚本会检测构建计算机上可用的功能,但不会检测部署计算机上的功能。

顺便说一句。您需要链接与在运行时使用的相同版本的Python。 CPython的ABI在功能版本之间不兼容(也就是说,2.6 ABI不一定与2.7 ABI兼容)。对于python 3.x,有一个稳定的ABI在功能版本之间兼容,但是AFAIK主要针对Python扩展,我不知道在你的应用程序中嵌入Python有多大用处。