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

能否将Android存储目录纳入Gradle Source Sets?Chaquopy开发疑问

问题核心分析

Gradle的sourceSets是构建阶段用来指定开发机器上项目源码/资源目录的配置,它完全不涉及Android设备运行时的内部存储路径——你配置的设备绝对路径,Gradle会当成开发机本地路径去创建空目录,自然没法访问设备存储里的用户文件,这方向从一开始就错了。

正确解决方案:运行时动态添加Python路径

Chaquopy支持在应用运行时,把设备存储目录添加到Python的sys.path中,这样解释器就能识别并加载该目录下的.py文件。具体分场景处理:

1. 访问应用内部存储目录(无需额外权限)

应用内部存储(比如/data/data/包名/files/)是私有目录,无需动态申请权限,直接获取路径并添加到sys.path即可:

Java/Kotlin代码示例

import com.chaquo.python.Python;
import java.io.File;

// 获取应用内部files目录
File internalFilesDir = getFilesDir();
String internalPath = internalFilesDir.getAbsolutePath();

// 将路径添加到Python的sys.path
Python.getInstance().getModule("sys").get("path").callAttr("append", internalPath);

Python代码示例(脚本内处理)

import sys
from com.chaquo.python import Python

# 获取应用上下文
context = Python.getInstance().getApplication()
internal_path = context.getFilesDir().getAbsolutePath()
sys.path.append(internal_path)

2. 访问外部存储目录(Downloads/Documents)

Android 10及以上采用分区存储,不能直接用/storage/emulated/0/Download这种硬编码绝对路径,需要通过**存储访问框架(SAF)**让用户选择目标目录,再将选中的目录路径转换为真实路径后,添加到sys.path,添加逻辑和内部存储一致。

3. 直接执行指定.py文件

如果不需要import该目录下的模块,只是想直接运行某个用户生成的.py文件,可直接调用Chaquopy的API执行,无需添加到sys.path:

import com.chaquo.python.Python;

// 传入用户生成的.py文件绝对路径
Python.getInstance().getModule("runpy").callAttr("run_path", "/path/to/user_script.py");
额外注意点
  • 权限适配:Android 10以下需申请READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE动态权限;Android 10+用SAF访问外部存储无需动态权限,仅需在Manifest声明基础权限。
  • 彻底区分构建阶段和运行阶段:sourceSets只负责打包开发机项目内的文件,和设备运行时的存储路径没有任何关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:30:49