gpt4 book ai didi

python - 如何在插件的 Objective-C OS X 应用程序中嵌入 python?

转载 作者:太空狗 更新时间:2023-10-29 21:31:29 25 4
gpt4 key购买 nike

我正在尝试在一个新的 OS X 应用程序中使用 python 来编写插件脚本。我正在寻找将一些程序逻辑卸载到 python 以便于即时修改。我从查看 Big Nerd Ranch tutorial 开始.这似乎可行,但它提出了一种链接 Python 的旧方法。似乎从 Xcode 5 开始,我们应该使用 this Mac Developer Library Tech Note 安装 python .然而,这个过程似乎创建了一个链接的 python 实例,而不是一个嵌入式实例。我已尝试遵循 answer to this question 中的指南但它似乎崩溃了。

所以我的问题是:构建 Python 以用作 Objective C Mac OS X 应用程序中的插件运行时的当前最佳实践是什么?如何确保它与应用程序捆绑在一起,并且可以在构建最终的 Objective C 应用程序之前安装任何可能需要的其他库?

最佳答案

我想出了一个似乎很有效的方法。

首先,从 official website 下载您要使用的 python 版本的源代码.在某处提取存档。我正在使用 Python 3.4.2。针对您正在使用的特定版本调整系统上的命令。

创建一个将用于此开发 python 版本的构建目录。整个目录中不应有空格,以确保 bash 正确解释 she-bang (#!) 行。我使用了 /Users/myaccount/development/python/devbuild/python3.4.2

进入解压后的Python目录,运行以下命令:

./configure --prefix="/Users/myaccount/development/python/devbuild/python3.4.2"
make
make install

这将在该开发构建目录中安装 python。设置 Python 路径以使用正确的目录:

export PYTHONPATH="/Users/myaccount/development/python/devbuild/python3.4.2/lib/python3.4/site-packages/"

进入 python bin 目录 (/Users/myaccount/development/python/devbuild/python3.4.2/bin) 并使用 pip3 在那里安装任何模块你需要的。 $PYTHONPATH 设置将确保模块安装到正确的 site-packages 目录中。

为 PyObjC 存储库找到一个方便的位置并将其克隆到那里。然后检查最新版本标签并安装它,确保你的 $PYTHONPATH 仍然正确:

hg clone https://bitbucket.org/ronaldoussoren/pyobjc
cd pyobjc
hg tags
hg checkout [the id of the latest version from the tag list]
/Users/myaccount/development/python/devbuild/python3.4.2/bin/python3 ./install.py

每当您需要更新 python 模块时,只需确保使用正确的 python bin 和 $PYTHONPATH

现在将 python 添加到 Xcode 项目。

/Users/myaccount/development/python/devbuild/python3.4.2 目录拖到 Xcode 项目中,根据需要将其设置为不复制项目,并创建一个文件夹引用。

/Users/myaccount/development/python/devbuild/python3.4.2/include/python3.4m 添加到 Xcode 项目的 中的 Header Search Paths 设置>build设置。不确定是否有一种方法可以将此作为一个通用步骤来搜索我们刚刚添加的文件夹引用目录。

将`/Users/myaccount/development/python/devbuild/python3.4.2/lib/libpython3.4m.a 库拖到Xcode 项目中,将其设置为添加为引用而不复制。

来自 Big Nerd Ranch scripting tutorial repository 的代码现在可以使用一些修改。

插件管理器代码需要一个 NSString 扩展来处理 Python API 似乎非常喜欢的 wchar_t 字符串:

@interface NSString (WcharEncodedString)

- (wchar_t*) getWideString;

@end

@implementation NSString (WcharEncodedString)

- (wchar_t*) getWideString {
const char* tmp = [self cStringUsingEncoding:NSUTF8StringEncoding];
unsigned long buflen = strlen(tmp) + 1;
wchar_t* buffer = malloc(buflen * sizeof(wchar_t));
mbstowcs(buffer, tmp, buflen);
return buffer;
}

@end

Python header 应包含如下:

#include "Python.h"

在调用 Py_Initialize() 之前需要运行以下代码,以便按照 Zorg 在其他问题上的建议设置正确的 python 可执行文件、PYTHONPATH 和 PYTHONHOME。

NSString* executablePath = [[NSBundle mainBundle] pathForResource:@"python3.4" ofType:nil inDirectory:@"python3.4.2/bin"];
Py_SetProgramName([executablePath getWideString]);

NSString* pythonDirectory = [[NSBundle mainBundle] pathForResource:@"python3.4" ofType:nil inDirectory:@"python3.4.2/lib"];
Py_SetPath([pythonDirectory getWideString]);
Py_SetPythonHome([pythonDirectory getWideString]);

最后,需要在 PluginExecutor.py 文件中扩展 python 路径,以包含高级 lib 路径的各个子目录。将以下代码添加到 Plugin Executor 文件的顶部:

import sys
from os import walk
path = sys.path.copy()
for p in path:
for root,dirs,files in walk(p):
if p is not root:
sys.path.append(root)

如果事情开始出现问题,我会发布更新,但目前这似乎是一个可行的解决方案。

关于python - 如何在插件的 Objective-C OS X 应用程序中嵌入 python?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26660287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com