Miao's Blog

macOS 安装 Miniforge 配置 Python/R 科研环境

Last updated: Jan 25, 2026

我的日常工作涉及大量生物信息学分析,如单细胞数据处理(Scanpy)、统计绘图(ggplot2, ggpubr)和生存分析(survminer)。这意味着我需要一个既能同时管理 Python 和 R 环境,又能顺滑安装 Bioconda 各类生信工具的包管理器。

折腾了一圈,我最终锁定了 Miniforge + Mamba 的组合。为什么选择这个方案?

1. 为什么不直接使用原生 Python 和 R? Python 自带的 venv 仅能隔离第三方包,无法管理 Python 解释器版本;而 R 的官方安装通常是全局性的,难以实现多版本共存。更关键的是,生信分析往往涉及跨语言调用(例如在 R 中通过 reticulate 调用特定的 Python 环境),Conda 能将特定的 Python 和 R 版本锁定在同一个独立空间内,确保调用链的稳定性。

此外,虽然 R 和 Python 的官方渠道都提供部分二进制包,但生信工具常依赖特定的底层系统库(如 GSL、NLOPT、FFTW)。原生安装往往需要用户手动通过 Homebrew 等工具配置复杂的系统依赖,极易产生版本冲突。Conda 则通过其生态实现了从底层系统库到解释器、再到上层扩展包的“全栈”二进制分发,极大地降低了环境迁移和复现的成本。

2. 选择 Miniforge 而非 Miniconda? Miniconda 默认连接 Anaconda 的官方频道(defaults channel)。根据 Anaconda 的服务条款,超过 200 人的企业或机构使用官方频道需要购买商业授权1。 Miniforge 则是社区驱动的项目,默认配置为使用 conda-forge 频道。这是一个完全开源、免费且活跃的社区频道,不仅避开了潜在的商业授权问题,还拥有极其丰富的软件包生态。 更重要的是,Anaconda 的官方频道以及其 R 频道维护极其保守,甚至可以说是停滞。以 r-biocmanager 这个常用包为例,截止到 2026年 1 月 26 日,R 频道 r-biocmanager 最后更新时间为 Jan 17, 2024 at 05:44,而 conda-forge 频道的最后更新时间为 Nov 14, 2025 at 17:22。R 频道这种老旧的包肯定是不行的,环境一定是错乱了。开源社区万岁!

3. 为什么不选择新兴的 uv? uv 是一个基于 Rust 的高性能 Python 包管理器。虽然在解析速度上极具优势,但它目前专注于 Python 生态,无法管理 R 语言环境,也无法直接安装 Bioconda 中的非 Python 工具。 另外,uv 倾向于“每个项目独立环境”(per-project)的开发模式。而在科研数据分析场景下,我们往往需要构建一个集成多种工具的全局分析环境(如包含所有单细胞分析流程的“瑞士军刀”环境),Conda 的环境管理模式在此场景下更为适用。

4. Mamba 的核心优势? Mamba 是 Conda 的 C++ 重写版本。它引入了并行下载和基于 libsolv 的依赖解析算法,解决了 Conda 在处理复杂依赖关系时速度缓慢的问题。对于包含成百上千个包的生信环境,Mamba 能将解析时间从分钟级缩短至秒级。

1. 安装 Miniforge

通过安装脚本直接安装2

# 清华源
wget -qO - https://mirrors.tuna.tsinghua.edu.cn/github-release/conda-forge/miniforge/LatestRelease/Miniforge3-MacOSX-arm64.sh | bash -s -- -b
# 或 GitHub 官方
wget -qO - https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh | bash -s -- -b

脚本将静默安装到 ~/miniforge3。安装完毕后初始化 Shell(我使用的是 zsh):

~/miniforge3/bin/mamba shell init --shell zsh
source ~/.zshrc

验证:

mamba --version
# 2.4.0

2. 配置国内镜像源

查看当前源:

conda config --show-sources
# ==> /Users/<username>/miniforge3/.condarc <==
# channels:
#   - conda-forge

清空默认配置,写入中科大镜像3。这里显式清空了 default_channels,防止回滚到 Anaconda 官方源,并设置 channel_prioritystrict,确保只从 conda-forgebioconda 获取软件包,规避二进制不兼容风险::

# 清空 Miniforge 自带配置
> ~/miniforge3/.condarc
# 创建全局配置
cat <<EOF > ~/.condarc
channels:
  - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge # 优先级最高:基座与最新通用库
  - https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda

default_channels: []
allow_other_channels: false

channel_priority: strict
show_channel_urls: true
solver: libmamba

pinned_packages:
  - r-base=4.5.* # 固定 R 关键版本

remote_connect_timeout_secs: 60.0
remote_read_timeout_secs: 120.0
remote_max_retries: 5
EOF

清理缓存并验证:

mamba clean -i
mamba config list

输出应只显示中科大镜像:

Collect information..
Cleaning index cache..
channels:
  - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge
  - https://mirrors.ustc.edu.cn/anaconda/cloud/bioconda
default_channels: ~
remote_connect_timeout_secs: 60
remote_max_retries: 5
channel_priority: strict
pinned_packages:
  - r-base=4.5.*

3. 创建虚拟环境

保持 base 环境最小化,所有工具安装到独立环境中。

我通常会创建一个 R 与 Python 混合的统计分析环境。这个环境主要用于处理实验数据、画图以及单细胞分析。在这个名为 rpy 的环境里,我指定了 Python 3.10,并一口气装好了 R 语言基础包、常用的 tidyverse、生信绘图包 ggpubr/survminer,以及 Python 这边的 scanpy 单细胞全家桶。

mamba create -n rpy python=3.11 \
  r-base r-tidyverse r-vroom r-languageserver r-IRkernel r-httpgd \
  r-ggpubr r-survminer r-ggprism r-ggsci r-pheatmap r-patchwork r-broom.mixed \
  r-biocmanager r-devtools r-remotes \
  pandas numpy scipy seaborn \
  scanpy anndata python-igraph leidenalg \
  rpy2 jupyterlab radian \
  -y

此外,我还会备一个日常通用的 Python 环境,比如用 Python 3.12,用于跑一些杂七杂八的小脚本。

mamba create -n py python=3.12 -y

为了方便起见,我配置了终端启动时默认激活这个通用环境:

mamba shell init --shell zsh
echo 'mamba activate py' >> ~/.zshrc
source ~/.zshrc

当然,如果你不喜欢自动激活,也可以随时撤销:

mamba shell deinit --shell zsh
# 或 conda init --reverse zsh

更高效的做法是设置别名。我在 .zshrc 里加了两行配置,这样输入 py 就进通用环境,输入 rpy 就进科研环境:

cat << EOF >> ~/.zshrc
# Custom aliases for environment switching
alias py="mamba activate py"
alias rpy="mamba activate rpy"
EOF
source ~/.zshrc

后续的环境管理也很简单,比如查看列表或删除环境:

# 查看环境列表
mamba env list
# 删除环境
mamba env remove -n rpy

4. 配置 R 语言

环境建好了,还需要稍微打磨一下 R 语言的配置。为了下载包更快,我通常会设置 CRAN 为清华镜像4

cat << EOF > ~/.Rprofile
options(
  repos = c(CRAN = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/"),
  download.file.method = "libcurl",
  BioC_mirror = "https://mirrors.tuna.tsinghua.edu.cn/bioconductor"
)
EOF

验证一下是否生效:

R -e 'options("repos")'

radian 是一个现代化的 R 交互式终端,提供了语法高亮、自动补全和多行编辑等功能,体验远超原生 R 控制台。为了方便使用,我们设置一个别名 r 来启动 radian,同时保留大写 R 用于执行原生 R 命令(如 R CMD 系列操作):

cat << EOF >> ~/.zshrc
# Use radian as the R interpreter
alias r="radian"
EOF

source ~/.zshrc

避免使用 alias R="radian" 会导致 conda 环境激活时的 R CMD javareconf 被错误解析而卡住。

我习惯用 Jupyter Notebook 写 R,所以还需要在 rpy 环境里安装 Jupyter 内核:

mamba activate rpy
R -e 'IRkernel::installspec(user = TRUE)'

注意:在使用 R 的过程中,尽量优先使用 mamba install r-<package_name> 安装 R 包,这样能确保系统依赖库(如 libxml2, openssl)与环境完美兼容。只有当 Conda 找不到该包时,再考虑在 R 内部使用 install.packages()。BioConductor 也是同理,尽量使用 mamba install bioconductor-<package_name>,只有在找不到包时再在 R 环境里使用 BiocManager::install("package_name")。只有上述方案均不可行时,再考虑 devtools::install_github() 从源码安装。

conda/mamba 最大的优势是对环境和版本的控制,尽量避免安装方式的混用,非常容易造成依赖混乱。

5. 环境备份

对于科研项目,环境的可复现性至关重要。可以在开始项目的时候创建一个新环境,在项目结题或投稿时导出环境配置文件:

# 导出不含本地构建标签的 yml 文件,增强跨机器兼容性
mamba env export --from-history > sepsis_project_env.yml

# 根据导出的文件重建环境
mamba env create -f sepsis_project_env.yml

6. 完全卸载

如需彻底清除,恢复系统原状:

# 1. 先获取安装路径(防止后面 conda 命令失效)
CONDA_BASE_ENVIRONMENT=$(conda info --base)
echo "Miniforge 安装在:${CONDA_BASE_ENVIRONMENT}"

# 2. 预览一下撤销初始化会修改哪些文件(dry-run)
conda init --reverse --dry-run

# 3. 正式撤销 Shell 初始化(删除 .zshrc 等文件中的 conda 配置)
conda init --reverse

# 4. 删除 Miniforge 整个目录
rm -rf ${CONDA_BASE_ENVIRONMENT}

# 5. 清理残留的配置文件和缓存
rm -f "${HOME}/.condarc"
rm -rf "${HOME}/.conda"

7. 番外:RStudio 集成

虽然平时我更偏好在 VS Code 或者 Jupyter Lab 中写 R,但是大部分教学是在 RStudio 中进行的。通过以上方法配置好 R 环境,在打开 RStudio 后会依旧报错无法找到 R 环境,这是因为在 macOS 中,conda/mamba 环境变量默认仅对终端会话有效,这意味着通过 Dock 栏或 Finder 双击图标启动 RStudio 这类图形应用时,它并不会读取 .zshrc 等终端配置文件,无法感知 conda/mamba 管理的 R 环境。RStudio 只会在系统默认路径中查找 R。

为了解决这个问题,我们需要利用 launchctlRSTUDIO_WHICH_R 变量注入到 macOS 的全局启动上下文中5

cat > ~/Library/LaunchAgents/user.rstudio.env.plist <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>user.rstudio.env</string>
  <key>ProgramArguments</key>
  <array>
    <string>sh</string>
    <string>-c</string>
    <string>launchctl setenv RSTUDIO_WHICH_R /Users/$USER/miniforge3/envs/rpy/bin/R</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
EOF

launchctl load ~/Library/LaunchAgents/user.rstudio.env.plist

注意替换实际的 R 路径,可以通过 which R 来找到。

这样就通过设置 LaunchAgents 来自动进行变量设置。运行后,可以通过以下命令验证是否设置成功:

launchctl getenv RSTUDIO_WHICH_R

如果输出了对应的 R 路径,说明配置已生效。完全退出 RStudio 后重新打开,即可正常使用 conda/mamba 环境中的 R。需要注意的是,虽然使用的是 RStudio,但在安装 R 包时,依旧尽量优先使用 mamba install 命令来进行安装,以避免在本地进行不必要的编译,节省时间和精力。

  1. Anaconda Terms of Service

  2. Miniforge GitHub

  3. 中科大 Anaconda 镜像帮助

  4. 清华 CRAN 镜像帮助

  5. How to set up conda-installed R for use with RStudio?