使用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
原因分析
- 依赖包冲突:同时声明
Crypto、PyCryptodome、pycrypto会导致模块加载混乱。PyCryptodome是pycrypto的官方替代版本,且自身已经包含Crypto命名空间,重复引入会引发模块导入异常。 - 模块缺失导入:
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
相关产品推荐
相关产品推荐

