Buildozer 无法编译 .apk,因为未定义“xrange”

问题描述

在 buildozer 编译过程中,我在使用 python3 pip 或 hmac 时遇到了一些问题。

错误显示xrange 未定义”,但仅当我在以前的 buildozer 文件夹 (.buildozer) 上编译时才会发生这种情况。

如果我删除 .buildozer 文件夹进行干净的构建,它会按预期工作,并且 .apk 也能正常工作。

我已经在 main.py 中添加了“xrange = range”

任何帮助将不胜感激。提前谢谢。

这是完整的构建器错误

[INFO]:    *** PYTHON PACKAGE / PROJECT INSTALL STAGE ***
[INFO]:    The requirements (kivy-garden.qrcode,kivy-garden.xcamera,kivy-garden.zbarcam,unix-time) don't have recipes,attempting to install them with pip
[INFO]:    If this fails,it may mean that the module has compiled components and needs a recipe.
[INFO]:    -> directory context /home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build
[INFO]:    -> running python3 -m venv venv
[INFO]:    Upgrade pip to latest version
[INFO]:    -> running bash -c source venv/bin/activate && pip install -U pip
Exception in thread background thread for pid 27840:                                                                                                                                                     
Traceback (most recent call last):
  File "/usr/lib/python3.7/threading.py",line 926,in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.7/threading.py",line 870,in run
    self._target(*self._args,**self._kwargs)
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 1633,in wrap
    fn(*rgs,**kwargs)
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 2557,in background_thread
    handle_exit_code(exit_code)
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 2261,in fn
    return self.command.handle_command_exit_code(exit_code)
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 861,in handle_command_exit_code
    raise exc
sh.ErrorReturnCode_1: 

  RAN: /bin/bash -c 'source venv/bin/activate && pip install -U pip'

  STDOUT:
Traceback (most recent call last):
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/bin/pip",line 10,in <module>
    sys.exit(main())
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_internal/cli/main.py",line 73,in main
    command = create_command(cmd_name,isolated=("--isolated" in cmd_args))
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_internal/commands/__init__.py",line 105,in create_command
    module = importlib.import_module(module_path)
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/other_builds/hostpython3/desktop/hostpython3/Lib/importlib/__init__.py",line 127,in import_module
    return _bootstrap._gcd_import(name[level:],package,level)
  File "<frozen importlib._bootstrap>",line 1006,in _gcd_import
  File "<frozen importlib._bootstrap>",line 983,in _find_and_load
  File "<frozen importlib._bootstrap>",line 967,in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>",line 677,in _load_unlocked
  File "<frozen importlib._bootstrap_external>",line 728,in exec_module
  File "<frozen importlib._bootstrap>",line 219,in _call_with_frames_removed
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_internal/commands/install.py",line 17,in <module>
    from pip._internal.cli.req_command import RequirementCommand,with_cleanup
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_internal/cli/req_command.py",line 18,in <module>
    from pip._internal.index.collector import LinkCollector
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_internal/index/collector.py",line 14,in <module>
    from pip._vendor import html5lib,requests
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/requests/__init__.py",line 43,in <module>
    from pip._vendor import urllib3
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/__init__.py",line 13,in <module>
    from .connectionpool import httpconnectionPool,HTTPSConnectionPool,connection_from_url
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connectionpool.py",line 11,in <module>
    from .connection import (
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/connection.py",line 15,in <module>
    from .util.proxy import create_proxy_ssl_context
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/__init__.py",line 8,in <module>
    from .ssl_ import (
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/venv/lib/python3.7/site-packages/pip/_vendor/urllib3/util/ssl_.py",line 3,in <module>
    import hmac
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/build-armeabi-v7a/build/python-installs/bitcodepro/hmac.py",in <module>
    trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
NameError: name 'xrange' is not defined


  STDERR:


Traceback (most recent call last):
  File "/usr/lib/python3.7/runpy.py",line 193,in _run_module_as_main
    "__main__",mod_spec)
  File "/usr/lib/python3.7/runpy.py",line 85,in _run_code
    exec(code,run_globals)
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py",line 1231,in <module>
    main()
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/entrypoints.py",in main
    ToolchainCL()
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py",line 688,in __init__
    getattr(self,command)(args)
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py",line 154,in wrapper_func
    build_dist_from_args(ctx,dist,args)
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/toolchain.py",line 208,in build_dist_from_args
    args,"ignore_setup_py",False
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/build.py",line 598,in build_recipes
    ignore_setup_py=ignore_project_setup_py
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/build.py",line 772,in run_pymodules_install
    ),_env=copy.copy(base_env))
  File "/home/ciko/Scrivania/bitCodePro-App/.buildozer/android/platform/python-for-android/pythonforandroid/logger.py",line 167,in shprint
    for line in output:
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 907,in next
    self.wait()
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",line 837,in wait
    self.handle_command_exit_code(exit_code)
  File "/home/ciko/.local/lib/python3.7/site-packages/sh.py",in <module>
    trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
NameError: name 'xrange' is not defined

编辑:

问题在于 hmac,因为它是为 python2 制作的。 问题出在 hmac.py 的第 8 行和第 9 行:

trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
                                             ^
trans_36 = "".join ([chr (x ^ 0x36) for x in xrange(256)])
                                             ^

python3 中,'xrange' 已被删除并替换为 'range'。所以我试图在我的 main.py 中添加xrange = range”,但它只适用于 buildozer clean 构建过程,而不是如果 .buildozer 文件夹已经存在,即使我构建了一个新的 .apk,它也适用于 clean构建但在第二次构建期间失败。

网上冲浪我找到了一种解决问题的不同方法,通过 pip 下载“future”包并将以下行添加到 main.py

from past.builtins import xrange

但正如我所说,它适用于干净的构建,但在接下来的构建中失败。

我的目标是不要每次都进行干净的构建,因为过程太长。有什么想法吗?

解决方法

我有解决方案!

  1. 从 buildozer.spec 要求中删除“hmac”;
  2. here下载官方python3.7 hmac.py
  3. 将 hmac.py 放入您的 buildozer 文件夹中,可能位于名为“my_pkgs”的专用子文件夹中,然后以这种方式直接从您的 main.py 中导入它:
    from my_pkgs import hmac

它在第一次干净构建期间完美运行,也适用于使用相同 .buildozer 文件夹发布的所有其他构建。 正是我正在寻找的。​​p>

[解决]是我的!