让 Python 在 Cocoa App 中工作

Posted

技术标签:

【中文标题】让 Python 在 Cocoa App 中工作【英文标题】:Getting Python to work in Cocoa App 【发布时间】:2014-02-07 09:48:37 【问题描述】:

我目前正在尝试让 Python 在 Cocoa 应用程序中工作。我的第一步是包含 Python,以便 Xcode 可以链接它。由于 OS X Mavericks,Python.framework 不再在 SDK 中,所以我按照this 的说明让它工作。创建一个项目并按照描述的步骤操作,Xcode 给我一个错误消息:

CpResource libpython2.7.dylib /Users/Phil/Library/Developer/Xcode/DerivedData/Python_Scripting-hiipjmacxsirqkfqczdjdaxbqgfj/Build/Products/Debug/Python\ Scripting.app/Contents/Resources/libpython2.7.dylib

cd "/Users/Phil/Documents/Xcode/Python Scripting"

builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks /Users/Phil/Documents/Xcode/Python\ Scripting/libpython2.7.dylib /Users/Phil/Library/Developer/Xcode/DerivedData/Python_Scripting-hiipjmacxsirqkfqczdjdaxbqgfj/Build/Products/Debug/Python\ Scripting.app/Contents/Resources

错误:/Users/Phil/Documents/Xcode/Python Scripting/../../../Python:没有这样的文件或目录

我很确定我正确地遵循了说明(例如,Py_IsInitialized() 被识别)。但是:声明Confirm the dialog box, and now Xcode is set to link against libpython2.7.dylib (by using the same -L and -l option settings as above). 是什么意思?我必须手动设置一些链接器标志吗?

【问题讨论】:

【参考方案1】:

当您将系统 libpython2.7.dylib 拖到您的项目中时,请确保未选中“复制项目...”复选框。您希望该库仅被引用,而不是复制到您的项目中。

您粘贴的 CpResource 命令使我确信 Xcode 正在尝试将文件从您的项目(不存在)复制到您的 .app 资源中。你也不想这样。如果 dylib 文件位于 Copy Bundle Resources 下的目标的 Build Phases 中,则应将其删除。 (你可以搜索 CpResource,你会发现有类似问题的人)。

值得一提的是,Apple 建议在嵌入脚本语言时不要依赖系统安装的版本,而是捆绑您自己的版本。这样一来,您就不会受到 Apple 过时的版本的影响,或者他们的版本后来被更改或从系统中删除。

编辑:

如果您想捆绑自己的 Python 版本,这是我为我的一个应用程序所做的(我使用的是 3.3 版):

从源代码下载并编译 Python。我建议静态编译它(它可能默认设置为这样做)。 复制静态库(.a 文件)、python3.3 库文件夹,并包含吐出到我的 Xcode 项目中的文件。 确认我的目标有一个构建阶段,将 python3.3 库文件夹从我的项目复制到我的 .app 中 在运行时初始化 Python 之前,将环境变量 PYTHONHOME 和 PYTHONPATH 设置到我的 .app 内的 python3.3 目录(使用 NSBundle 检索的路径) #include "Python.h" 并调用 Py_Initialize() 将 python3.3/lib-dynload/ 目录的路径(在我的 .app 中)附加到 Python 的 sys.path 变量中,以便可以导入其中的 C 编译模块

它应该可以工作。

可选:

您可能不想在您的应用中包含超过 100 MB 的 Python 数据。我使用此命令将所有标准库 .py 源文件就地转换为 .pyc 字节码文件:

path/to/built/python -m compileall path/to/python3.3/ -b

(-b 在 2.x 中可能不需要/不相关)

然后我继续删除 __pycache__,以及我知道我不需要的任何包/模块(例如 tkinter、antigravity 等)。我将捆绑的 python 文件的大小增加到 20 MB 左右(压缩时为 7 MB)

【讨论】:

谢谢,我尽量不复制,我确实做到了。我确实安装了自己的 Python,但是如何将它制作成一个包以在 Xcode 中使用? 我以为你指的是系统版本,所以我说不要将它复制到你的项目中。我编辑了我的帖子来解释如何捆绑你自己的版本。 是的,我指的是那个。对不起,混乱。我只是对如何更进一步并包含自定义 python 感兴趣。 Mac下如何将Python编译为静态库? @Alerty 只是一个标准的 ./configure --prefix=path;制作;进行安装。 Python 3.x 默认会吐出一个静态库。

以上是关于让 Python 在 Cocoa App 中工作的主要内容,如果未能解决你的问题,请参考以下文章

Mac OSX Cocoa App:是不是可以让您的 App 使用 san francisco 字体(用于 Apple Watch 的字体)?

无法让 Firestore 快速入门在 Python 中工作

让 Ensembles Idiomatic OSX App 与 iCloud 同步

将 Cocoa 应用程序和命令行工具组合成一个 App Bundle

让请求在 curl 中工作,但不在 Python 中

无法让二级路线在快递中工作