【问题标题】:python and objc bridge in an existing application现有应用程序中的 python 和 objc 桥接
【发布时间】:2010-05-24 13:41:56
【问题描述】:

我刚开始用 objc 编程,我在想如何在现有的 objc 应用程序中使用 python 代码。我在这个站点和其他一些线程中找到了一些线程,但它们根本没有帮助我。我想要做的是获取apple's developer website 中的 SpotlightAPI,并使用结果用 python 代码处理它们。到目前为止,我已经完成了以下工作:
1. 从苹果下载了 SpotlightAPI
2。基于 PyObjc
3 中的 cocoa-python 应用程序模板创建了一个新项目。将 SpotlightAPI 中的控制器文件添加到 PyObjC
4。以与 SpotlightAPI
5 中相同的方式配置绑定。执行程序,所有工作都成功
6。创建了一个继承自 NSObject(称为 python.py)
7 的新 python 类文件。 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)
有谁知道我做错了什么?

【问题讨论】:

    标签: python objective-c pyobjc


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多