python - 让 Python 在 Cocoa App 中工作

标签 python cocoa xcode5

我目前正在尝试让 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

error: /Users/Phil/Documents/Xcode/Python Scripting/../../../Python: No such file or directory

我非常确定我正确遵循了说明(例如 Py_IsInitialized() 已被识别)。但是:语句确认对话框,现在 Xcode 设置为链接 libpython2.7.dylib(通过使用与上面相同的 -L 和 -l 选项设置)。 是什么意思?我是否必须手动设置一些链接器标志?

最佳答案

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

您粘贴的 CpResource 命令让我相信 Xcode 正在尝试将文件从您的项目(不存在)复制到 .app 的资源中。你也不想要那样。如果 dylib 文件位于目标的“构建阶段”的“复制捆绑资源”下,则应将其删除。 (您可以搜索 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、反重力等)。我将捆绑的 Python 文件大小调整到了 20 MB 左右(压缩后为 7 MB)

关于python - 让 Python 在 Cocoa App 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21624324/

相关文章:

python - 在 numpy 行上并行化循环

python - 我们如何将 numpy 数组的两列连接成一列,并用空格分隔值?

python - 使用 Flask 应用程序在本地计算机上出现 404 错误

objective-c - 如何将 NSString 对象中的字符转换为 UILabel 对象?

python - 使用单个元素解压元组,如果元组为 None,则返回 None

Cocoa:对象在不应该自动释放的时候被自动释放

objective-c - 以编程方式打开 prefpane 的最快方法?

ios - 不使用 Facebook 和 Twitter 帐户的 Gigya native 登录

ios7 - 使用Xcode5,iOS7模拟器和XCTest生成gcda文件

iphone - Xcode 5,如何构建具有与 IOS 6 和 IOS 7 兼容的 UI 的应用程序