Osadzanie Pythona w aplikacji na iPhone'a

96

Więc to jest nowe tysiąclecie; Apple machnął ręką; teraz legalne jest włączenie interpretera języka Python do aplikacji na iPhone'a (App Store).

Jak się to robi? Cała istniejąca dyskusja (nic dziwnego) odnosi się do jailbreakingu. (Starsze pytanie: czy mogę pisać natywne aplikacje na iPhone'a w Pythonie )

Moim celem nie jest tutaj napisanie aplikacji PyObjC, ale napisanie zwykłej aplikacji ObjC, która uruchamia Python jako wbudowaną bibliotekę. Kod Pythona wróci następnie do natywnego kodu Cocoa. Jest to wzorzec „logika sterująca to kod w Pythonie”.

Czy istnieje przewodnik po tym, jak zbudować Python w XCode, aby moja aplikacja na iPhone'a mogła go połączyć? Najlepiej okrojony Python, ponieważ nie będę potrzebował 90% standardowej biblioteki.

Prawdopodobnie potrafię zrozumieć wątki i API rozszerzenia Pythona; Zrobiłem to na MacOS. Ale tylko przy użyciu kompilatorów wiersza polecenia, a nie XCode.

Andrzej Plotkin
źródło

Odpowiedzi:

30

Tak naprawdę nie ma znaczenia, w jaki sposób tworzysz Pythona - nie musisz na przykład budować go w Xcode - ale liczy się produkt tej kompilacji.

Mianowicie, będziesz musiał zbudować coś takiego jak libPython.a, które można statycznie połączyć z twoją aplikacją. Po utworzeniu pliku .a można go dodać do projektu Xcode dla aplikacji, a stamtąd będzie on połączony i podpisany, tak jak reszta aplikacji.

IIRC (minęło trochę czasu, odkąd ręcznie zbudowałem Pythona), gotowy python zbuduje bibliotekę libPython.a (i kilka innych bibliotek), jeśli skonfigurujesz go poprawnie.

Oczywiście, drugim problemem będzie kompilacja krzyżowa Pythona dla ARM z twojego zestawu 86 . Python jest projektem opartym na autoconf, a autoconf to problem dla kompilacji krzyżowej.

Jak poprawnie stwierdzisz, zmniejszenie jej rozmiaru będzie miało krytyczne znaczenie.

Nie jest też zaskakujące, że nie jesteś pierwszą osobą, która chce to zrobić, ale nie na iOS. Python został wciśnięty na urządzenia o wiele mniej wydajne niż te z systemem iOS. Podczas wyszukiwania w Google znalazłem wątek z wieloma linkami; to może być użyteczne .

Możesz również dołączyć do listy pyobjc-dev . Chociaż nie celujesz w aplikację opartą na PyObjC (co przy okazji jest dobrym pomysłem - PyObjC ma długą drogę, zanim będzie przyjazny dla iOS), społeczność PyObjC dyskutowała o tym i Ronald, o kimkolwiek, jest prawdopodobnie najbardziej kompetentną osobą w tej dziedzinie. Zauważ, że PyObjC będzie musiało rozwiązać problem z osadzonym Pythonem na iOS przed przeniesieniem PyObjC. Ich warunkiem wstępnym jest jakby twoje wymaganie.

bbum
źródło
Dzięki za linki. (Użyłem Pythona na Sharp Zaurus dla znacznie wcześniejszej wersji tego projektu, ale to był Python 1.6 i ktoś inny zajmował się pakowaniem ...)
Andrew Plotkin
4
Kiedyś przeportowałem Pythona na PSP Sony; może pomoże ci trochę historii Subversion. Nie do końca jednak odpowiedź. tutaj: python-psp.net/trac
fraca7
22

Umieściłem bardzo zgrubny skrypt na githubie, który pobiera i buduje python2.6.5 dla iPhone'a i symulatora.

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

Praca w toku

Nieco przygnębiająca aktualizacja prawie 2 lata później: (skopiowana z README na github)

Ten projekt nigdy tak naprawdę nie sprawił, że Python działał na iPhonie ku mojemu zadowoleniu i nie mogę polecić używania go w żadnym poważnym projekcie na tym etapie.

Najbardziej brakuje obsługi pyobjc (która okazuje się znacznie trudniejsza do przeniesienia na iPhone'a, ponieważ opiera się na kodzie bardziej specyficznym dla platformy)

Brakuje również możliwości statycznej kompilacji modułów (wszystkie są obecnie zbudowane jako dylibs, które działają na potrzeby programowania, ale według mojej wiedzy nie byłyby dozwolone w App Store)

W tym momencie ten projekt ma być głównie punktem wyjścia dla każdego mądrzejszego ode mnie, który chce i może rozwiązać powyższe problemy.

Naprawdę chciałbym, żeby pisanie aplikacji w całości w Pythonie było praktyczne, ale w tym momencie wydaje się to niemożliwe.

cobbal
źródło
Dzięki! Nie będę miał okazji na to patrzeć przez kilka dni, ale na pewno niedługo spróbuję.
Andrew Plotkin,
Jeśli pyobjcjest trudny do skompilowania, czy można go użyć ctypes? W takim przypadku ta odpowiedź może być wskazówką (uświadomienie sobie, że byłby to początek dużej i bolesnej pracy, ale jednak).
Jacob Oscarson,
10

Ja też zacząłem taki projekt. Jest dostarczany z własnym uproszczonym skryptem kompilującym, więc nie ma potrzeby mieszania się z autoconf, aby uzyskać skompilowaną krzyżowo bibliotekę statyczną. Jest w stanie zbudować całkowicie wolną od zależności bibliotekę statyczną Pythona z kilkoma popularnymi modułami. Powinien być łatwo rozszerzalny.

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

Albert
źródło
Twój skrypt kompilacyjny nie działa. Nie kompiluje się, ale brakuje mu niektórych wbudowanych modułów, takich jak „-collections”. Jakieś pomysły?
bijan
Nie włączyłem wszystkich natywnych modułów C. Po prostu to zmodyfikuj.
Albert
Wydaje się przestarzały ... działa tylko z iOS 4.3? Czy możesz udokumentować, jak sprawić, by to działało z bardziej aktualnymi wersjami?
ArtOfWarfare
@ArtOfWarfare: Od jakiegoś czasu go nie używałem, dlaczego nie miałoby działać z nowszymi wersjami? Może zgłoś błąd na GitHub, jeśli zauważysz jakieś problemy.
Albert,