You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用tapo-plug、Kivy和Buildozer开发安卓App启动崩溃:sys未定义

安卓应用启动崩溃:NameError: name 'sys' is not defined

问题详情

使用tapo-plug、Kivy和Buildozer开发的安卓应用启动即崩溃,手机返回报错栈:

02-04 16:32:53.560 23072 23113 I python  :  Traceback (most recent call last):
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/app/main.py", line 19, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/tapo_plug/tapoPlugApi.py", line 11, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/tapo_plug/tapoEncryption.py", line 7, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/Crypto/PublicKey/RSA.py", line 38, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/Crypto/IO/PKCS8.py", line 44, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/Crypto/IO/_PBES.py", line 43, in <module>
02-04 16:32:53.561 23072 23113 I python  :    File "/home/daniel/test/ServerManagementApp/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/Vexludus/arm64-v8a/Crypto/Hash/MD5.py", line 45, in <module>
02-04 16:32:53.561 23072 23113 I python  :  NameError: name 'sys' is not defined
02-04 16:32:53.561 23072 23113 I python  : Python for android ended.

报错关联的代码片段:

from Crypto.Util.py3compat import *
from Crypto.Util._raw_api import (load_pycryptodome_raw_lib,
VoidPointer, SmartPointer,
create_string_buffer,
get_raw_buffer, c_size_t,
c_uint8_ptr)

_raw_md5_lib = load_pycryptodome_raw_lib("Crypto.Hash._MD5",
"""
#define MD5_DIGEST_SIZE 16

                    int MD5_init(void **shaState);
                    int MD5_destroy(void *shaState);
                    int MD5_update(void *hs,
                                      const uint8_t *buf,
                                      size_t len);
                    int MD5_digest(const void *shaState,
                                      uint8_t digest[MD5_DIGEST_SIZE]);
                    int MD5_copy(const void *src, void *dst);

                    int MD5_pbkdf2_hmac_assist(const void *inner,
                                        const void *outer,
                                        const uint8_t first_digest[MD5_DIGEST_SIZE],
                                        uint8_t final_digest[MD5_DIGEST_SIZE],
                                        size_t iterations);
                    """)

当前requirements配置包含:tapo-plug、Crypto、PyCryptodome、pyjwkest、pycrypto

原因分析

  1. 依赖包冲突:同时声明Crypto、PyCryptodome、pycrypto会导致模块加载混乱。PyCryptodome是pycrypto的官方替代版本,且自身已经包含Crypto命名空间,重复引入会引发模块导入异常。
  2. 模块缺失导入:Crypto.Util.py3compat内部依赖sys模块,但在安卓打包环境中,该模块可能未被正确导入,导致MD5.py调用时触发NameError。

解决步骤

  • 清理冲突依赖:修改buildozer.spec中的requirements,只保留必要的包,删除Crypto和pycrypto,最终配置示例:
    requirements = python3,kivy,tapo-plug,PyCryptodome,pyjwkest
    
  • 清理旧构建缓存:执行命令彻底清除之前的构建文件,避免残留冲突:
    buildozer android clean
    
  • 重新打包应用:重新执行构建命令,确保新的依赖被正确安装和打包:
    buildozer android debug deploy run
    
  • 临时修复(若上述方法无效):找到本地依赖中的Crypto/Hash/MD5.py文件,在文件开头添加import sys语句,再重新打包。但此方法仅作临时 workaround,优先推荐依赖清理方案。

内容的提问来源于stack exchange,提问作者Vexludus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:55:22