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