Einbetten von Python in eine iPhone-App

93

Es ist also ein neues Jahrtausend; Apple hat mit der Hand gewinkt; Es ist jetzt legal, einen Python-Interpreter in eine iPhone-App (App Store) aufzunehmen.

Wie macht man das? Alle bestehenden Diskussionen (nicht überraschend) beziehen sich auf Jailbreaking. (Ältere Frage: Kann ich native Python-Apps mit Python schreiben? )

Mein Ziel hier ist nicht, eine PyObjC-App zu schreiben, sondern eine reguläre ObjC-App, die Python als eingebettete Bibliothek ausführt. Der Python-Code ruft dann den nativen Cocoa-Code auf. Es ist das Muster "Steuerlogik ist Python-Code".

Gibt es eine Anleitung zum Erstellen von Python in XCode, damit meine iPhone-App es verknüpfen kann? Am liebsten ein abgespeckter Python, da ich nicht 90% der Standardbibliothek benötige.

Ich kann wahrscheinlich die Threading- und Python-Erweiterungs-API herausfinden; Ich habe das unter MacOS gemacht. Aber nur mit Befehlszeilen-Compilern, nicht mit XCode.

Andrew Plotkin
quelle

Antworten:

29

Es spielt keine Rolle, wie Sie Python erstellen - Sie müssen es beispielsweise nicht in Xcode erstellen -, aber was wichtig ist, ist das Produkt dieses Builds.

Sie müssen nämlich so etwas wie libPython.a erstellen, das statisch mit Ihrer Anwendung verknüpft werden kann. Sobald Sie eine .a haben, kann diese dem Xcode-Projekt für Ihre Anwendung (en) hinzugefügt werden und von dort aus wird sie wie der Rest Ihrer App verknüpft und signiert.

IIRC (es ist schon eine Weile her, seit ich Python von Hand erstellt habe) Die sofort einsatzbereite Python erstellt eine libPython.a (und eine Reihe anderer Bibliotheken), wenn Sie sie richtig konfigurieren.

Natürlich wird Ihr zweites Problem darin bestehen, Python für ARM aus Ihrer 86- Box zu kompilieren . Python ist ein auf Autoconf basierendes Projekt, und Autoconf ist ein Problem bei der Cross-Kompilierung.

Wie Sie richtig sagen, ist es wichtig, es klein zu machen.

Kein Wunder ist auch, dass Sie nicht die erste Person sind, die dies tun möchte, aber nicht für iOS. Python wurde in Geräte integriert, die viel weniger leistungsfähig sind als solche, auf denen iOS ausgeführt wird. Ich habe beim Googeln einen Thread mit einer Reihe von Links gefunden. es könnte nützlich sein .

Vielleicht möchten Sie auch der pyobjc-dev- Liste beitreten . Während Sie nicht auf eine PyObjC-basierte Anwendung abzielen (was übrigens eine gute Idee ist - PyObjC ist noch weit davon entfernt, iOS-freundlich zu werden), hat die PyObjC-Community dies und Ronald von allen diskutiert. ist wahrscheinlich die sachkundigste Person in diesem speziellen Bereich. Beachten Sie, dass PyObjC das Problem mit eingebettetem Python unter iOS lösen muss, bevor PyObjC portiert werden kann. Ihre Voraussetzung ist sozusagen Ihre Anforderung.

bbum
quelle
Danke für die Links. (Ich habe Python auf Sharp Zaurus für eine viel frühere Version dieses Projekts verwendet, aber das war Python 1.6 und jemand anderes hat die Verpackung gemacht ...)
Andrew Plotkin
4
Ich habe Python einmal auf Sonys PSP portiert. Vielleicht hilft Ihnen ein Teil des Subversion-Verlaufs. Nicht gerade eine Antwort. hier: python-psp.net/trac
fraca7
21

Ich habe ein sehr grobes Skript für Github erstellt, das Python2.6.5 für iPhone und Simulator abruft und erstellt.

http://github.com/cobbal/python-for-iphone

In Arbeit

Etwas deprimierendes Update fast 2 Jahre später: (kopiert von README auf Github)

Dieses Projekt hat Python nie wirklich zu meiner Zufriedenheit auf dem iPhone zum Laufen gebracht, und ich kann es derzeit nicht für ernsthafte Projekte empfehlen.

Am bemerkenswertesten fehlt die Pyobjc-Unterstützung (die sich als viel schwieriger auf das iPhone zu portieren herausstellt, da sie auf plattformspezifischerem Code basiert).

Es fehlt auch die Möglichkeit, Module statisch zu kompilieren (alle sind derzeit als Dylibs erstellt, die für die Entwicklung geeignet sind, aber meines Wissens im App Store nicht zulässig sind).

An diesem Punkt ist dieses Projekt hauptsächlich als Ausgangspunkt für alle gedacht, die klüger als ich sind und die oben genannten Probleme angehen wollen und können.

Ich wünschte wirklich, es wäre praktisch, Apps vollständig in Python zu schreiben, aber an diesem Punkt scheint es unmöglich.

Cobbal
quelle
Vielen Dank! Ich werde ein paar Tage lang keine Gelegenheit haben, es mir anzusehen, aber ich werde es auf jeden Fall bald versuchen.
Andrew Plotkin
Wenn pyobjces schwierig zu kompilieren ist, ist es möglich, es zu verwenden ctypes? In diesem Fall könnte diese Antwort ein Hinweis sein (zu erkennen, dass dies nur der Beginn einer großen und schmerzhaften Arbeit wäre, aber immer noch).
Jacob Oscarson
9

Ich habe auch ein solches Projekt gestartet. Es wird mit einem eigenen vereinfachten Kompilierungsskript geliefert, sodass Sie nicht mit autoconf herumspielen müssen, um Ihre Cross-kompilierte statische Bibliothek zu erhalten. Es ist in der Lage, eine vollständig abhängigkeitsfreie statische Python-Bibliothek mit einigen gängigen Modulen zu erstellen. Es sollte leicht erweiterbar sein.

https://github.com/albertz/python-embedded/

Albert
quelle
Ich bekomme Ihr Compilescript nicht zum Laufen. Es wird zwar kompiliert, es fehlen jedoch einige integrierte Module wie '-collections'. Irgendwelche Ideen?
Bijan
Ich habe nicht alle nativen C-Module aufgenommen. Ändern Sie es einfach.
Albert
Scheint veraltet zu sein ... funktioniert nur mit iOS 4.3? Können Sie dokumentieren, wie dies mit aktuelleren Versionen funktioniert?
ArtOfWarfare
@ArtOfWarfare: Ich habe es eine Weile nicht mehr benutzt. Warum sollte es nicht mit neueren Versionen funktionieren? Erstellen Sie möglicherweise einen Fehlerbericht auf GitHub, wenn Sie Probleme sehen.
Albert