必须通过沙箱服务的依赖挂载与安全策略协同配置:先确认docker/volumes/sandbox/路径存在且含dependencies/和conf/子目录(权限755),再在python-requirements.txt中精确声明库版本,配置config.yaml启用网络并设置allowed_domains白名单,最后重启sandbox容器并验证日志及代码节点调用结果。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中为Python代码节点启用自定义第三方库支持,必须通过沙箱服务的依赖挂载与安全策略协同配置,否则代码执行时会因ImportError或PermissionError直接中断。
确认沙箱服务版本与挂载路径
进入Dify部署目录(如 dify-1.11.4),检查 docker/volumes/sandbox/ 是否存在。该路径是沙箱容器唯一识别的持久化挂载点,【若不存在,后续所有配置均无效】。
运行 ls -l docker/volumes/sandbox/,确认目录下至少包含 dependencies/ 和 conf/ 两个子目录。缺少任一目录需手动创建,且权限须为 755,否则沙箱启动时跳过依赖加载。
注入Python第三方库依赖
方法一:通过 requirements.txt 自动安装
打开 docker/volumes/sandbox/dependencies/python-requirements.txt,逐行写入所需库及精确版本号。例如:
PyMySQL==1.0.2
openpyxl==3.1.2
python-dotenv==1.0.0
注意:不写版本号会导致沙箱在不同环境安装不一致版本,引发兼容性崩溃;空行或注释行会被忽略,但首尾不可有不可见字符。
方法二:预编译二进制包(适用于含C扩展的库)
将已编译好的 .whl 文件(如 numpy-1.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl)放入 docker/volumes/sandbox/dependencies/wheels/ 目录,再在 python-requirements.txt 中用 --find-links ./wheels --no-index 开头声明,强制 pip 从本地加载。
放开网络访问权限
第一步:编辑 docker/volumes/sandbox/conf/config.yaml
确保文件中存在以下配置块,且 enable_network 值为 true:
enable_network: true
network_proxy_url: ""
allowed_domains: ["api.example.com", "httpbin.org"]
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
第二步:若需调用内网服务,必须将目标域名或IP明确加入 allowed_domains 列表。沙箱默认禁用所有DNS解析和TCP连接,【未列入白名单的域名请求会静默失败,无错误日志】。
第三步:保存后无需重启Dify核心服务,但必须重启沙箱容器使配置生效。
重启沙箱并验证依赖加载
进入 dify/docker 目录,执行:
docker-compose up -d sandbox
等待约15秒后,查看沙箱容器日志:docker logs -f dify-sandbox-1 | grep "Installing dependencies"。若看到类似 Successfully installed pymysql-1.0.2 openpyxl-3.1.2 的输出,说明依赖已就绪。
若日志中出现 Failed to install 或 Permission denied,立即检查 python-requirements.txt 文件编码是否为UTF-8无BOM,以及文件末尾是否有残留空格。
在代码节点中调用新库
新建工作流,添加「代码执行」节点,语言选 Python3,输入以下测试代码:
import pymysql
def main():
return {"status": "OK", "pymysql_version": pymysql.__version__}
点击「运行节点」。若返回结果中包含 "pymysql_version": "1.0.2",说明配置成功。
若报错 ModuleNotFoundError: No module named 'pymysql',说明沙箱容器未正确加载依赖,请回到上一步检查日志;若报错 ConnectionRefusedError,说明 allowed_domains 未覆盖目标地址。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










