现有应用程序中的python和objc桥

时间:2010-05-24 13:41:57

标签: python objective-c pyobjc

我心不在焉地开始用objc编程,我在闲逛如何在现有的objc应用程序中使用python代码。我在这个网站和其他一些网站上找到了一些帖子,但他们根本没有帮助我。我想做的是采用apple's developer website中找到的SpotlightAPI并使用结果用python代码处理它们。到目前为止,我已经完成了以下工作:1。从苹果2下载了SpotlightAPI。基于PyObjc
3的cocoa-python应用程序模板创建了一个新项目。将SpotlightAPI中的控制器文件添加到PyObjC
4中。配置绑定的方式与SpotlightAPI中的绑定方式相同。执行该程序并成功完成所有工作。创建了一个新的python类文件,它继承自NSObject(称为python.py)
7。 python文件具有以下代码:

from Foundation import *
import objc

NSObject = objc.lookUpClass(u"NSObject")
print "PYTHON VERSION BEING USED:"

class Python(NSObject):
    def sendit_(self, something):
        print something
        return "asdf"


8.我在Controller.m文件的开头插入了这段代码:

@class Python;

@interface NSObject (MethodsThatReallyDoExist)
-(NSString *) sendit: (id) aString;

@end

@implementation Controller
- (id)init
{
    self = [super init];
    Class pythonClass = NSClassFromString(@"Python");
    myPython = [pythonClass new];
    NSLog(@"Created PythonClass: %@", myPython);
    NSString * oneString = [myPython sendit:@"asdf"];
    NSLog(@"%@", oneString);
    return self;
}


9.在Controller.h文件的变量声明中添加id *myPython;
10.在controller.m文件中实现了sendit方法,如下所示:

- (NSString *) sendit:(id) aString
{

    return [myPython sendit:aString];
}


它编译并成功运行,但我从init函数得到的控制台消息是:Created PythonClass: (null)并且下一个日志的字符串返回是(null)
谁知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

您列出的代码中有一些可疑的内容。首先,您应该id myPython而不是id *myPython,因为ID已经是指针。其次,您在NSString类别上声明了一个方法,但是在子类中实现它。通常,您希望在同一个类的类别实现中实现该方法(在本例中为NSObject)。第三,将它作为一个方法在NSObject上有点循环,当它实现时调用myPython上的sendit,它也是一个NSObject。我很惊讶它编译并且不会崩溃。尝试清理这些问题,看看你得到了什么。希望这有帮助!