Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将python嵌入Objective-CosX插件应用程序中?_Python_Objective C_Xcode_Macos_Cocoa - Fatal编程技术网

如何将python嵌入Objective-CosX插件应用程序中?

如何将python嵌入Objective-CosX插件应用程序中?,python,objective-c,xcode,macos,cocoa,Python,Objective C,Xcode,Macos,Cocoa,我正在尝试在一个新的OSX应用程序中使用python来编写插件脚本。我希望将一些程序逻辑卸载到python中,以便进行简单的动态修改。我是从看电视开始的。这似乎是可行的,但它提出了一种链接Python的旧方法。似乎从Xcode 5开始,我们就应该使用安装python。然而,这个过程似乎创建了一个链接的python实例,而不是一个嵌入式实例。我试着按照指南中的指导进行操作,但似乎失败了 所以我的问题是:在Objective C Mac OS X应用程序中构建python作为插件运行时的最佳实践是什

我正在尝试在一个新的OSX应用程序中使用python来编写插件脚本。我希望将一些程序逻辑卸载到python中,以便进行简单的动态修改。我是从看电视开始的。这似乎是可行的,但它提出了一种链接Python的旧方法。似乎从Xcode 5开始,我们就应该使用安装python。然而,这个过程似乎创建了一个链接的python实例,而不是一个嵌入式实例。我试着按照指南中的指导进行操作,但似乎失败了


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

我想出了一种似乎效果相当好的方法

首先,从中下载要使用的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
设置将确保模块安装到正确的
站点软件包
目录中

为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项目的
构建设置中的
标题搜索路径设置中。不确定是否有一种方法可以作为一个通用步骤来执行此操作,只搜索我们刚刚添加的文件夹引用目录

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

现在,只需稍作修改即可使用中的代码

插件管理器代码需要一个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标头应包括以下内容:

#include "Python.h"
在调用
Py\u 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]);
最后,python路径需要在
PluginExecutor.py
文件中展开,以包括高级
lib
路径的各个子目录。将以下代码添加到插件执行器文件的顶部:

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)

如果出现问题,我会发布更新,但目前看来这是一个可行的解决方案。

链接到OS X附带的Python框架有什么问题?OS X附带的Python框架运行的是python2.7。我更喜欢用蟒蛇3。另外,如何将非标准模块合并到插件中?我不想仅仅为了安装一个本地Cocoa应用程序就必须安装系统范围的python模块。谢谢您的详细解释+1.