在带有 buildozer 的 android 上使用 python3
Posted
技术标签:
【中文标题】在带有 buildozer 的 android 上使用 python3【英文标题】:Using python3 on android with buildozer 【发布时间】:2016-07-31 23:17:10 【问题描述】:我用 python 3 和 kivy 编写了一个小程序。现在我想使用 buildozer 构建一个 .apk 并在我的 android 手机上测试该应用程序。一切正常,我能够在手机上安装应用程序,但应用程序在启动时崩溃了。
错误日志显示,apk 的 python 环境是 python 2.7 而不是 3。 因此,我的问题是:是否可以在 android 上使用 python 3 环境构建带有 buildozer 的 apk?还是我必须在 python2 中重写应用程序?是否有可能强制 buildozer 使用 python3 的黑客攻击?
编辑:我按照 inclement 建议的步骤操作,得到以下错误:
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
编辑 2: 这似乎是一个永无止境的故事。安装了 python3.5 我遇到了这个错误:
collect2: error: ld returned 1 exit status
error: command 'arm-linux-androideabi-gcc' failed with exit status 1
随着我过去从错误到错误的前进,将代码简单地更改为 python2.7 会更聪明,但现在我投入了这么多时间,我只想最终成功。 :-)
那么有人知道如何解决这个问题吗?
最后编辑:我终于投降并更改了我的代码以使用 python 2.7。在此过程中,我看到了一个很好的建议:如果您使用 futures,则必须将其添加到 buildozer 文件的要求中。否则,应用程序在启动时会崩溃并显示“空模块”错误消息。
现在我的应用程序可以在手机上运行,我终于高兴了 :-) 感谢我试图帮助我解决问题。
【问题讨论】:
我也遇到了同样的问题,被除法运算符的不同所困扰,所以我只是添加了: from __future__ import division ,并确保我的类继承适用于 2.7 和 3。但是我很想知道我们是否可以使用 Kivy 在 Python 3 中工作并期望将其变成应用程序... 【参考方案1】:我不确定 buildozer 是否有 python3 的构建选项,但 python-for-android 实验性地支持它。您可以通过从其主分支安装 buildozer 并使用 android_new
目标 (buildozer android_new debug
) 来使用新版本的 python-for-android。如果 buildozer 可以使用它的 python3 选项,您需要在要求中添加python3crystax
(如果有,请替换 python2),手动下载 CrystaX NDK,并将 buildozer 的 NDK 路径选项设置为指向它。可能还需要在需求中写kivy==1.9.1
而不仅仅是kivy
。
Python3 构建仍在开发中,以具有 Python2 的所有功能,并且需要进行一些清理,包括修剪包含的文件和压缩更多内容。一些菜谱也不适用于 python3,但大多数都可以。
编辑:除非您的脚本很复杂并且大量使用 py2/py3 的主要差异(例如 unicode 处理),否则使用 python2 代替可能并不难。由于它们几乎是同一种语言,因此您可能不需要“重写”,只需进行一些小改动即可。
【讨论】:
感谢您的回答。你是对的,使应用程序与 python2 兼容只是有限的努力。如果没有任何效果,我会这样做。但是,我将尝试按照您的说明运行它。目前我遇到的问题是我没有安装 python 3.5 并且我的发行版没有官方包。我会告诉你故事是如何结束的:-) 用python3.5打包apks不需要python3.5,python构建是在本地构建或复制的(在本例中来自CrystaX的python构建)。 我在开始的帖子中添加了错误日志。如果我不用安装python3.5为什么会出现这个错误? 哦,我的错,它目前确实有点依赖于 python3.5(从技术上讲,它可能不是,但代码目前需要它)。【参考方案2】:首先(至少几周前)kivy 无法正确使用 python 3.5,请改用 3.4;检查您的导入,有时它可能是完整模块导入的问题;示例 - 不要使用 import math,而是使用 from math import ...;最好的方法是使用您可以从 kivy 页面下载的预构建 buildozer 映像;我正在使用它,除了完全导入之外从来没有任何问题,而且 shebang 行也应该在构建之前从代码中删除(有时会出现问题)
【讨论】:
Kivy 声称现在支持 python 3.7。 buildozer 是否适用于 3.7?【参考方案3】:如果你从源代码编译 buildozer,而不是从 pip 编译,2018 年的自述文件声称支持 python3:
https://github.com/kivy/buildozer/
我会包含构建说明,但它们可能会在几个月内更改
【讨论】:
@RodneySalcedo fixeed以上是关于在带有 buildozer 的 android 上使用 python3的主要内容,如果未能解决你的问题,请参考以下文章
带有buildozer的android中的kivy应用程序,终端循环“#waiting for application to start”
无法在 Android 上播放音频(ffpyplayer) - buildozer
Python/Kivy/Buildozer - 应用程序在 Android 中崩溃,但在 PC 上运行良好
请! Kivy 应用 Buildozer 可在 Windows 上运行,但不能在 Android 上运行