2016-04-10 7 views
4

Ich habe ein kleines Programm in Python 3 und Kivy geschrieben. Jetzt möchte ich eine .apk mit Buildozer bauen und die App auf meinem Android-Handy testen. Alles funktionierte und ich konnte die App auf dem Telefon installieren, aber die App stürzte beim Start ab.Verwendung von Python3 auf Android mit Buildozer

Das Fehlerprotokoll ergab, dass die Python-Umgebung der Apk Python 2,7 statt 3 war. Meine Frage ist daher: Ist es möglich, eine APK mit Buildozer mit einer Python 3-Umgebung auf Android zu bauen? Oder muss ich die App in python2 neu schreiben? Gibt es vielleicht einen Hack, der buildozer dazu zwingt, python3 zu benutzen?

Edit: Ich folgte den von rauem vorgeschlagenen Schritte und bekam folgende Fehlermeldung:

Traceback (most recent call last): 
File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main 
    "__main__", fname, loader, pkg_name) 
File "/usr/lib64/python2.7/runpy.py", line 72, in _run_code 
    exec code in run_globals 
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 747, in <module> 
    main() 
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 744, in main 
    ToolchainCL() 
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 323, in __init__ 
    getattr(self, args.command)(unknown) 
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 105, in wrapper_func 
    build_dist_from_args(ctx, dist, dist_args) 
File "/home/micha/python/ZugGit/ZugAppFahrt/.buildozer/android/platform/python-for-android-master/pythonforandroid/toolchain.py", line 142, in build_dist_from_args 
    build_recipes(build_order, python_modules, ctx) 
File "pythonforandroid/build.py", line 560, in build_recipes 
    recipe.build_arch(arch) 
File "pythonforandroid/recipe.py", line 910, in build_arch 
    self.build_cython_components(arch) 
File "pythonforandroid/recipe.py", line 919, in build_cython_components 
    command = sh.Command('python{}'.format(self.ctx.python_recipe.version)) 
File "/usr/lib/python2.7/site-packages/sh.py", line 788, in __init__ 
    raise CommandNotFound(path) 
sh.CommandNotFound: python3.5 
# Command failed: python -m pythonforandroid.toolchain create --dist_name=zugFart --bootstrap=sdl2 --requirements=kivy==1.9.1,python3crystax --arch armeabi-v7a --copy-libs 

Edit 2: Dies ist eine unendliche Geschichte zu sein scheint. Mit installiert python3.5 lief ich in diesen Fehler:

collect2: error: ld returned 1 exit status 
error: command 'arm-linux-androideabi-gcc' failed with exit status 1 

Mit der Zeit habe ich von Fehler voran verwendet, um zu Fehler wäre es viel klüger sein, einfach den Code zu python2.7 zu ändern, aber jetzt, dass ich so viel habe investierte Zeit möchte ich es endlich schaffen. :-)

Hat also jemand eine Idee, wie man dieses Problem lösen kann?

Letzte Änderung: Ich habe schließlich aufgegeben und meinen Code geändert, um mit Python 2.7 zu arbeiten. Ein guter Rat, den ich während dieses Prozesses überwachte: Wenn Sie Futures verwenden, ist es obligatorisch, es den Anforderungen der buildozer Datei hinzuzufügen. Ansonsten stürzt die App beim Start mit der Fehlermeldung "Leeres Modul" ab.

Jetzt, wo meine App am Telefon funktioniert, bin ich endlich glücklich :-) Danke an ruchloses Versuchen, mir bei meinem Problem zu helfen.

+0

Ich hatte das gleiche Problem, wurde mit dem Unterschied in Division Betreiber erwischt, also habe ich gerade hinzugefügt: aus \ _ \ _ future \ _ \ _ import division, und stellte sicher, dass meine Klassenvererbung sowohl mit 2.7 als auch mit 3. arbeitete. Aber ich würde gerne wissen, ob wir in Python 3 mit Kivy arbeiten können und erwarten mach es zu einer App ... –

Antwort

3

Ich bin nicht sicher, ob buildozer eine Build-Option für python3 hat, aber Python-for-android unterstützt es experimentell. Sie können die neue Version von python-for-android verwenden, indem Sie buildozer von seinem Hauptzweig installieren und das Ziel android_new (buildozer android_new debug) verwenden. Wenn buildozer mit der Option python3 arbeiten soll, müssen Sie in den Anforderungen python3crystax hinzufügen (ersetzen Sie python2, falls vorhanden), laden Sie CrystaX NDK manuell herunter, und setzen Sie die NDK-Pfadoption von buildozer so, dass sie darauf zeigt. Es könnte auch notwendig sein, kivy==1.9.1 in die Anforderungen zu schreiben, anstatt nur kivy.

Python3-Builds sind noch in der Entwicklung, um alle Funktionen der python2-Einsen zu haben, und müssen etwas aufgeräumt werden, einschließlich des Trimmens der enthaltenen Dateien und mehr Komprimierung. Einige Rezepte funktionieren auch noch nicht mit python3, obwohl die meisten dies tun.

Edit: Wenn Ihr Skript nicht kompliziert ist und die großen py2/py3-Unterschiede wie die Unicode-Behandlung nutzt, wäre es wahrscheinlich nicht schwierig, stattdessen python2 zu verwenden. Da sie fast die gleiche Sprache sind, brauchen Sie wahrscheinlich kein "Umschreiben", nur ein paar kleine Änderungen.

+0

Danke für deine Antwort. Sie haben recht, es ist nur ein begrenzter Aufwand, um die App kompatibel zu python2 zu machen. Wenn nichts geht, werde ich es tun. Wie auch immer, ich werde versuchen, es zum Laufen zu bringen. Im Moment stecke ich mit dem Problem fest, dass ich Python 3.5 nicht installiert habe und meine Distribution keine offiziellen Pakete hat. Ich werde euch wissen lassen, wie die Geschichte endete :-) – magenulcus

+0

Sie brauchen python3.5 nicht, um apks mit python3.5 zu packen, der Python-Build wird lokal erstellt oder kopiert (in diesem Fall von CrystaX-Python-Builds). – inclement

+0

Ich habe das Fehlerprotokoll in meinem Startpost hinzugefügt. Wenn ich python3.5 nicht installieren muss, warum tritt dieser Fehler auf? – magenulcus

0

zuerst (vor ein paar Wochen) kivy hat nicht richtig mit Python 3.5 gearbeitet, stattdessen 3.4; Überprüfen Sie Ihre Importe auch manchmal könnte es ein Problem mit vollen Modulimporten sein; Beispiel - Verwenden Sie keine Importmathematik, sondern verwenden Sie stattdessen den Matheimport ...; Und das beste ist, vorgefertigte buildozer Bild zu verwenden, das Sie von der kivy Seite herunterladen können; Ich benutze das und hatte nie irgendwelche Probleme außer volle Importe und Shebang Linie sollte auch aus dem Code vor dem Aufbau gelöscht werden (manchmal macht Probleme)