2009-08-20 15 views
7

Estoy desarrollando una aplicación Python/ObjC y necesito llamar a algunos métodos en mis clases de Python desde ObjC. He intentado varios productos sin éxito.Llamar a Python desde Objective-C

  • ¿Cómo puedo llamar a un método de Python desde Objective-C?
  • Las clases de My Python se están creando instancias en el Generador de interfaces. ¿Cómo puedo llamar a un método desde esa instancia?

Respuesta

16

Utilice PyObjC.

Se incluye con Leopard & después.

>>> from Foundation import * 
>>> a = NSArray.arrayWithObjects_("a", "b", "c", None) 
>>> a 
(
     a, 
     b, 
     c 
) 
>>> a[1] 
'b' 
>>> a.objectAtIndex_(1) 
'b' 
>>> type(a) 
<objective-c class NSCFArray at 0x7fff708bc178> 

Incluso funciona con IPython:

In [1]: from Foundation import * 

In [2]: a = NSBundle.allFrameworks() 

In [3]: ?a 
Type:  NSCFArray 
Base Class: <objective-c class NSCFArray at 0x1002adf40> 

`

Para llamar desde Objective-C en Python, la forma más fácil es:

  • declaran un resumen superclase en Objective-C que contiene la API a la que desea llamar

  • crean implementaciones de código auxiliar de los métodos en @implementation de la clase

  • subclase de la clase en Python y proporcionar implementaciones concretas

  • crean un método de fábrica en la superclase abstracta que crea instancias de las subclases concretas

Ie

@interface Abstract : NSObject 
- (unsigned int) foo: (NSString *) aBar; 
+ newConcrete; 
@end 

@implementation Abstract 
- (unsigned int) foo: (NSString *) aBar { return 42; } 
+ newConcrete { return [[NSClassFromString(@"MyConcrete") new] autorelease]; } 
@end 

..... 

class Concrete(Abstract): 
    def foo_(self, s): return s.length() 

..... 

x = [Abstract newFoo]; 
[x foo: @"bar"]; 
+0

No veo cómo funciona esto. Por ejemplo, asumo lo siguiente: (1) pongo el código python en un archivo Concrete.py (2) pongo el código obj-c en Abstract.h/m Dado que, ¿cómo construyes esto exactamente? ¿programa? – Fooberman

+0

Actualización: Hay una aclaración en este ticket: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman

+0

¿Falta un paréntesis de cierre después de "MyConcrete"? –