如何在Modal Notebooks安装Miniconda或切换Python至3.11?
在Modal Notebooks中运行Chatterbox TTS的可行方案
核心问题分析
Modal Notebooks默认使用Python 3.12,而Chatterbox依赖的numpy==1.25.2无法在Python 3.12中构建(因Python 3.12移除了distutils)。同时Modal环境存在以下限制:
- 系统Python为外部管理环境,无法直接安装包
- 无sudo权限,无法修改系统级配置
- 独立shell会话的环境变量不持久
以下是三种可行的解决方法:
方案1:使用Modal自定义镜像指定Python 3.11
Modal支持为函数指定自定义镜像,可直接基于Python 3.11镜像构建运行环境,完全避开Notebook默认的Python 3.12环境:
import modal # 构建包含Chatterbox依赖的Python 3.11镜像 image = modal.Image.from_registry("python:3.11-slim") \ .apt_install("gcc", "g++", "git") # 安装编译依赖 .pip_install("chatterbox", "numpy==1.25.2") # 定义使用该镜像的函数 @modal.function(image=image) def generate_tts(text): from chatterbox import TTS tts = TTS() return tts.generate(text) # 在Notebook中调用函数 result = generate_tts("测试文本").remote() print(result)
这种方法利用Modal的容器隔离特性,函数运行在独立的Python 3.11环境中,无需修改Notebook的会话环境。
方案2:在Notebook会话中创建Python 3.11虚拟环境
通过pyenv在用户目录安装Python 3.11并创建虚拟环境,绕过外部管理环境的限制:
- 安装pyenv及编译依赖(无需sudo,仅在用户目录安装):
curl https://pyenv.run | bash export PATH="$HOME/.pyenv/bin:$PATH" eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)" apt-get update && apt-get install -y --no-install-recommends build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev
- 安装Python 3.11并创建虚拟环境:
pyenv install 3.11.8 pyenv virtualenv 3.11.8 chatterbox-env pyenv activate chatterbox-env pip install chatterbox numpy==1.25.2
- 运行Chatterbox代码:
# 确保在激活的虚拟环境中运行 from chatterbox import TTS tts = TTS() print(tts.generate("测试文本"))
方案3:正确配置Miniconda环境
解决之前PATH不持久的问题,将所有conda相关操作放在同一个shell会话或Python subprocess中:
import subprocess import os # 下载并安装Miniconda到用户目录 subprocess.run(["wget", "https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh"], check=True) subprocess.run(["bash", "Miniconda3-latest-Linux-x86_64.sh", "-b", "-p", os.path.expanduser("~/miniconda")], check=True) # 将conda路径加入环境变量 conda_bin_path = os.path.expanduser("~/miniconda/bin") os.environ["PATH"] = f"{conda_bin_path}:{os.environ['PATH']}" # 创建Python 3.11环境并安装依赖 subprocess.run(["conda", "create", "-n", "chatterbox-env", "python=3.11", "-y"], check=True) subprocess.run(["conda", "run", "-n", "chatterbox-env", "pip", "install", "chatterbox", "numpy==1.25.2"], check=True) # 在conda环境中运行Chatterbox代码 subprocess.run( ["conda", "run", "-n", "chatterbox-env", "python", "-c", "from chatterbox import TTS; tts = TTS(); print(tts.generate('测试文本'))"], check=True )
这种方法通过Python进程统一管理环境变量,确保conda命令能被正确找到。
Modal环境关键限制说明
- 外部管理环境:默认系统Python为externally-managed,禁止直接安装包,必须使用虚拟环境或自定义镜像。
- 无sudo权限:所有软件安装必须在用户目录下进行,无法修改系统级文件。
- 独立shell会话:每个
!命令对应独立的shell,环境变量不会跨会话保留,需将相关命令合并执行或通过Python设置全局环境变量。
内容的提问来源于stack exchange,提问作者Zulqarnain Jalil




