2009-11-20 3 views
4

bbum posted un aperçu de la façon de faire cela, mais je suis incapable de compléter les détails. Où va le code Python, et comment mon code Objective-C le connaîtra-t-il? Comment ferais-je compiler sur la ligne de commande?Appel de Objective-C en Python

Répondre

12

Source ici:

Calling Python From Objective-C

J'ai posté un full explanation of how to do this to my weblog car il est un peu plus longtemps que quelque chose que je posterais ici. Le résumé abstrait reste le même: utilisez une classe abstraite pour fournir les informations de type nécessaires pour rendre le compilateur C heureux et les métadonnées nécessaires pour rendre le pont heureux.

+3

Très belle écriture. Je pense que le point fixe est toujours comment configurer les choses pour appeler Python sans l'appel python d'origine en Objective-C. En d'autres termes, comment puis-je appeler en code python à partir de mon application Objective-C existante? ou Comment puis-je écrire des plugins pour mon application Objective-C en utilisant python? –

1

Google est votre ami. Effectuer une recherche sur la chaîne "Cocoa Python" rapidement trouvé PyObjc.

+0

Cela ne s'arrête-t-il pas dans Snow Leopard? –

+0

Je ne pense pas, je viens de donner une démo sur PyObjC la semaine dernière sur Snow Leopard. –

+4

PyObjC est inclus avec Snow Leopard et est encore très supporté par Apple. –

3

Malheureusement, l'histoire de l'utilisation de Python via PyObjC à partir d'une application Objective-C n'est pas très bonne pour le moment. py2app livré avec PyObjC peut compiler des paquets chargeables (ie peut être chargé via NSBundle), ce qui semble être la meilleure approche: définir une sous-classe NSObject en python qui implémente un protocole (obtenu via objc.protocolNamed) que vous définissez en Objective-C, puis compilez ce fichier python dans un ensemble chargeable via py2app (qui utilise un fichier setup.py standard). Malheureusement, py2app n'a pas eu beaucoup d'amour, en particulier la cible plugin (bundle chargeable), et une fuite de mémoire sérieuse a été introduite autour de 10.5 de sorte que toutes les données transmises de python à Objective-C proviennent d'un paquet compilé py2app. Yuck.

PyObjC manipule le moteur d'exécution Objective-C conformément au code lié ObjC exécuté en Python, donc pour pouvoir appeler du code python de Objective-C, les grandes lignes va comme

  1. wrapper Write PyObjC autour du code python
  2. Code d'exécution déclarant l'encapsuleur PyObjC pour ajouter ces définitions à l'exécution ObjC
  3. Appel de l'encapsuleur PyObjC à partir d'Objective-C. Parce qu'il a été déclaré lors de l'exécution, les symboles ne sont pas disponibles au moment de la compilation, vous devrez donc utiliser NSClassFromString et al. pour instancier la classe. Il est utile de déclarer un @protocol avec les méthodes appropriées afin que le compilateur Objective-C ne se plaint pas des méthodes manquantes.

Si vous avez la flexibilité, la meilleure option est d'utiliser les modèles d'applications Cocoa-Python (à savoir créer une application Python), puis chargez votre code Objective-C comme un ensemble chargeable à partir de Python. Cela prend soin de gérer l'interpréteur Python pour vous. Sinon, avec le code main.m du modèle d'application Cocoa-Python, vous devriez pouvoir créer un interpréteur Python, exécuter votre code PyObjC, puis continuer. Évidemment, l'interpréteur doit continuer à fonctionner pour que votre code python puisse s'exécuter, donc vous devrez probablement le faire à partir d'un thread séparé. Comme vous pouvez le voir, cela peut devenir un peu poilu. Mieux vaut aller avec l'application Python, comme décrit ci-dessus. Gardez à l'esprit que PyObjC n'est pas garanti pour bien fonctionner avec le garbage collector Objective-C, donc toutes ces options nécessitent que votre code Objective-C n'utilise pas GC.

Questions connexes