Ubuntu20.04下用conda搭建MCScanX工具链全攻略
2026/9/17 1:38:52 网站建设 项目流程

种地这么多年,一直在跟各种生信软件的依赖斗争。尤其是做共线性分析时绕不开的MCScanX,本身是个好东西,但装依赖的过程真的能让人怀疑人生:Perl模块要一个个装,C++编译环境要配,系统库版本一不对就给你脸色看。直到我换到Ubuntu20.04之后,下决心把所有工具链都迁到conda上,才算是从这种反复折腾里解脱出来。

这篇文章就是我在Ubuntu20.04上实际搭建MCScanX工具链的完整记录。不讲虚的,直接说conda怎么帮我把Perl、BioPerl、编译环境这些乱七八糟的依赖一次搞定,以及过程中我踩过的坑、排查过的报错。如果你想在Ubuntu20.04上顺利跑起MCScanX,又不想陷在手工装依赖的泥潭里,这篇应该能帮你省下至少两天时间。

1. 先聊清楚MCScanX到底依赖什么,为什么手动装会想砸电脑

1.1 MCScanX是干嘛的,共线性分析是啥(快速入门版)

MCScanX是一个做共线性分析的经典工具,全称是Multiple Collinearity Scan toolkit,它用来在多个物种或者同一物种的不同基因组区域之间,找到那些保持着祖先顺序排列的同源基因区块。

这个概念听起来有点学术,我用一个粗糙但好懂的例子解释:假设你有两个物种A和B,它们的基因组各自经历了长期的进化重排,但总有一些基因片段,比如在A染色体上的顺序是“基因1-基因2-基因3”,在B染色体上仍然是“基因1-基因2-基因3”,那这一块就被视为共线性区块。这种区块是研究物种进化关系、基因复制和功能分化的核心依据。

MCScanX就是干这个检测工作的,跑完会输出一个包含共线性区块信息的文件,之后配合下游脚本做圈图、做基因对Ka/Ks分析、做进化树注释,一套完整的比较基因组学分析链路就串起来了。

1.2 手动安装的经典连环坑:Perl模块、编译器和版本冲突

既然要跑MCScanX,那它运行起来到底需要什么?我拆开说。

MCScanX的主程序是C++写的,所以最直接的需求是编译工具链,也就是g++和make。如果你下载的是预编译版本还好说,要是从GitHub拉源码自己编,gcc版本不对、缺少zlib库之类的报错一个接一个。

更麻烦的是MCScanX自带的下游分析脚本,大量依赖Perl环境,比如BioPerl、Getopt::Long这类模块。这些模块在Ubuntu20.04里虽然可以apt install,但apt仓库里的版本普遍偏老,跟脚本里某些函数调用对不上号的情况我遇到过不止一次。如果再叠加一个情况:你的服务器上已经装了Anaconda、系统自带的Perl、还有为了其他项目手动编译的zlib,那我只能说,版本冲突的大戏马上开演。

换个角度想:你为了装MCScanX一个工具,可能要把系统里的Perl升级、把g++换成特定版本、还要处理库文件路径。关键是,这还只是第一步,生物信息学分析从来不是只装一个软件就完事的,后面还得装别的分析工具,如果每个软件都这么折腾一遍,时间根本不够用。

1.3 conda到底解决了什么问题

conda解决的是软件依赖管理的根本问题:环境隔离和版本锁定。

环境隔离这个概念,我用生活场景类比一下:做菜的时候,不同菜系需要的调料不一样,如果所有调料都堆在一个锅里,味道全乱了。conda做的事情就是给每个项目准备一个独立的厨房,川菜馆的厨房里放辣椒,甜品店的厨房里放糖,互不干扰。

具体到MCScanX这个场景,conda可以帮我在一个独立的“厨房”里安装指定版本的Perl、指定版本的BioPerl、指定版本的编译工具链,甚至MCScanX本身。这些软件只对这个环境生效,不会污染系统Python,也不会影响我服务器上其他正在运行的服务。

更重要的是,conda生态里有一个叫bioconda的频道,专门收集生物信息学软件。MCScanX早就被打包进去了,这意味着别人已经帮我把依赖关系梳理好了,我只需要一条命令,conda就自动把所有依赖按正确的版本装齐。这就是它比手工编译高效的地方。

2. Ubuntu20.04上把conda装好并配到顺手

2.1 装Miniconda而不是Anaconda,理由很简单

很多新手纠结Anaconda和Miniconda选哪个。我的建议很明确:装Miniconda,别装Anaconda。

Anaconda自带了几百个预装包,乍一看很省事,但实际使用中你根本用不到那么多,而且这些预装包体积巨大,占空间不说,还容易跟你后续安装的版本产生冲突。Miniconda只带conda本身和Python,干净、轻量、可控,你需要什么再自己装什么,这才是conda的正确用法。

下载方式没什么悬念,去清华镜像或者官方网站下载Miniconda的Linux安装脚本就行。我当时的下载命令是:

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh

如果官方源下载速度不行,就把域名换成清华的镜像站,速度快很多。下载好之后执行安装脚本,一路接受协议,安装路径按默认放在~/miniconda3就行。安装过程中会问你是否要执行conda init,这里要选是,它会自动把conda的初始化配置写入shell配置文件。

2.2 conda init那点事:报错怎么处理

装完conda之后,很多人会遇到一个经典报错:

conda: command not found

或者运行conda activate的时候提示:

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. To initialize your shell, run: $ conda init

这两个问题本质是同一个:shell没有加载conda的初始化脚本。解决方案就是执行conda init并重启shell:

conda init bash source ~/.bashrc

如果你用的是zsh或者其他shell,把bash替换成对应的shell名即可。核心思路就是让conda在每次打开终端时自动把自己暴露到PATH里。

这里有一个容易忽略的细节:如果你是在无root权限的服务器上安装,安装目录写到了自己的家目录,那source ~/.bashrc之后依然找不到conda命令,这时候检查一下~/.bashrc里是不是多了几个以>>> conda initialize >>>开头的配置块,有就说明init成功了,没有就再手动执行一次conda init bash

2.3 换国内镜像源,不然真的等到天荒地老

conda装好之后如果你直接用默认源,在国内网络环境下装包会慢到让你怀疑是死机还是网断了。这里我强烈建议先把源换成清华镜像。

配置方式是一条命令一个配置项,直接在终端里执行:

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/

加完之后,重点来了:要给conda设置一个通道优先级规则,让它严格按照我们设定的顺序去找包,不然它还是可能会自动去官方源碰运气:

conda config --set channel_priority strict

设置完毕之后,可以用conda config --show channels确认一下当前配置,看到那四个镜像地址就算成功了。

这里有个经验之谈:镜像源配置越早做越好。如果你已经在默认源下装了部分环境再换源,倒也不会出错,但中途混着源装的包,后续有时会有依赖解析不一致的情况,不如从一开始就统一。

2.4 顺手装上mamba,秒杀慢吞吞的solver

conda装小包还行,但一旦环境里依赖比较复杂,conda的solver(依赖解析器)慢得是出了名的,经常会卡在Solving environment这一步半天没反应。这个问题的解法是装mamba。

mamba是一个用C++重写的conda依赖解析器,底层算法更高效,解析依赖的速度比conda快好几倍,而且命令用法跟conda几乎一模一样。装它只需要一行:

conda install -n base -c conda-forge mamba

装好之后,后面凡是需要安装软件或者创建环境,我都直接用mamba代替conda,比如:

mamba install -n 环境名 包名

实际体验下来,mamba在解析复杂生物信息学环境时的速度优势非常明显,我强烈建议你在正式创建MCScanX环境之前就把mamba装好,后面能省下大量等待时间。

3. 实测:用conda一键创建环境并安装MCScanX

3.1 创建独立环境,跟系统Python彻底隔离

准备工作就绪之后,就开始正式搭建MCScanX的工具链了。第一步是创建独立环境。

你可能会问,为什么非要单独创建一个环境,直接在base环境里装行不行?我的回答是:行,但很不推荐。base环境是conda自己的主环境,很多基础工具都在里面,如果你往里装了各种生信软件,一旦某个软件升级导致依赖变动,可能会把整个base环境搞崩。独立环境的好处是边界清晰,这个环境装坏了删掉重来,几秒钟的事,不影响其他工作。

创建环境并安装MCScanX,一条命令就能完成。我当时的命令是这样的:

mamba create -n mcscanx -c conda-forge -c bioconda mcscanx

这里的参数含义我逐一说清楚:

  • -n mcscanx:环境名,我用的是mcscanx,你可以按自己的习惯起名。
  • -c conda-forge -c bioconda:指定使用的conda频道。bioconda是生信软件的家,但bioconda里的包依赖conda-forge里的基础包,所以两者要同时指定,顺序上conda-forge在前、bioconda在后比较稳妥。
  • mcscanx:要安装的软件包名。

执行这条命令之后,mamba会开始解析依赖。因为MCScanX在bioconda里已经有成熟的打包,所以它会被自动安装到这里面的同时,conda也会把MCScanX运行需要的Perl、BioPerl等依赖一并装进这个环境。

这个过程就是文章标题说的“一键搞定”,理论上你不需要去管任何依赖细节,mamba会帮你处理。

3.2 安装命令的原理与细节

虽然上面那条命令看起来很简单,但背后其实有好几个值得深挖的点。

第一,为什么MCScanX在bioconda里安装不需要自己编译?因为bioconda的维护者已经帮我们把源码编译成了二进制的可执行文件,并且打包好了。这就是开源生态的好处。你所做的只是让conda把包下载下来,放到对应的环境目录里。

第二,-c conda-forge -c bioconda这两个参数为什么要同时出现?MCScanX作为生信软件,在bioconda频道里;但它的依赖,比如某个Perl模块,可能只在conda-forge频道有打造好对应版本的包。如果只指定一个频道,conda很可能因为找不到依赖而报错。所以两者缺一不可。

第三,依赖解析失败怎么办?如果你用的还是conda而不是mamba,在这一步可能会遇到Solving environment卡死或者提示冲突。这种情况通常是因为你的通道优先级没有设置好,或者本地有缓存导致了包解析错乱。解决办法是先按2.3小节配好通道优先级,再清理一下缓存:

conda clean -a

然后重新执行创建环境的命令,基本能解决。

3.3 验证是否真的装成功了

安装完成之后,别急着高兴,先验证环境是否真的可用。验证分三步走。

第一步,激活环境。激活的意义是让当前终端会话使用这个环境下的软件,而不是系统的默认版本:

conda activate mcscanx

执行完之后,终端提示符前面会多出(mcscanx)这么个前缀,表示你已经进入了mcscanx环境。

第二步,检查MCScanX主程序能不能运行。MCScanX的调用命令是大写形式的:

which MCScanX MCScanX -h

如果which能输出路径,说明主程序已经在PATH里了。如果MCScanX -h能显示出帮助信息,那基本可以确定程序本身没有问题。

第三步,检查Perl下游脚本是否就绪。MCScanX源码包里附带的下游分析脚本一般在downstream_analysis目录下,里面有个名为java的子目录存放着多个Java程序,另外还挂着几个Perl脚本。你可以在env环境里看一下这些脚本的依赖是否满足:

perl -e 'use BioPerl; print "ok\n"'

不过这一步不用太紧张,因为如果把mcscanx的包安装完整,这些依赖在环境创建时就一并配好了,实测下来只要主程序能跑,下游分析的脚本调用也没问题。

4. 装完之后容易被忽略的四个细节

4.1 环境备份与复现:yaml文件才是你的“逃生舱”

很多人把环境装好之后就直接开干了,从来不做备份。等某天环境莫名损坏、或者要从这台服务器迁移到另一台服务器的时候,才开始后悔。

conda里最实用的备份方式不是打包整个环境文件夹,而是把环境依赖列表导出成一个yaml文件。导出方式:

conda activate mcscanx conda env export > mcscanx_environment.yaml

这个yaml文件里记录了当前环境的所有包名和版本号,还包括了来源频道。换一台电脑或者需要恢复的时候,只要从conda环境里直接加载:

conda env create -f mcscanx_environment.yaml

就能把整个环境原封不动地重建出来,这比手工重新安装一遍可靠得多。

有个细节提醒一下:导出的yaml文件里包版本是锁定到具体版本号的,比如某个包写了=1.20.0=0这种格式。如果几个月后再用这个yaml恢复环境,这些版本大概率还能找到,但偶尔也会遇到源仓库里老版本被下架的情况。所以我还有一个习惯,除了导出yaml,还会把MCScanX的输入输出数据、配置文件的路径都记录在一个readme里,这样哪怕环境重建,也不至于忘了之前的分析参数。

4.2 conda目录千万不要动:剪切粘贴毁所有

这里要聊一个很多新手踩过的坑:conda装好之后,以为自己懂了Linux的文件管理,把~/miniconda3这个目录挪到了另一个路径,或者干脆把某个环境文件夹拷贝到别的机器上直接用。

结果呢?一会儿conda activate报错,一会儿环境里的软件No such file or directory。这是因为conda在安装软件的时候,大量使用了绝对路径写入了程序的启动脚本和配置文件。你一旦把这个目录移动了,所有写死的路径就全部失效,整个环境等于报废。

这就好比装修公司在改水电的时候,把所有管线长度都按图纸算好了,你装修完了突然把房子拆了一面墙重新砌,那水路电路全得乱套。

所以记住一句话:conda安装目录一旦确定,就不要再去移动它。如果你非要迁移环境,正确方式是4.1节说的导出yaml文件,在新机器上重建,而不是直接把目录剪切粘贴过去。

4.3 PyCharm里接入conda环境,本地调试更方便

如果你的日常习惯是先用Python脚本做训练、分析、调参,再调用MCScanX跑共线性,那么把conda环境接入IDE会让流程顺畅很多。

以PyCharm为例,在设置里找到Python解释器,选择Conda Environment,然后用Existing environment指向你刚创建的mcscanx环境里的python解释器,路径大致为:

~/miniconda3/envs/mcscanx/bin/python

这样做的意义是:你在PyCharm里运行脚本时,用的Python解释器、Perl路径、环境变量全部来自mcscanx环境,不会出现脚本里调用了MCScanX命令却告诉你command not found的尴尬情况。

同理,如果你用VS Code,也可以在终端里先conda activate mcscanx再启动VS Code,或者直接把VS Code的默认终端集成改成conda环境。

4.4 环境里的数据文件管理思路

最后分享一个关于数据文件管理的心得。MCScanX跑完之后会生成一系列中间文件,比如.collinearity文件、.tandem文件、以及下游分析需要的各种输入格式。

很多人的习惯是直接把分析结果放在工作目录里,但conda环境本身并不适合长期存放分析数据。为什么?因为环境目录里装的全是软件,一旦你清理环境重新创建,或者导出环境的时候,这些分析文件可能被误删或者混淆。

我的习惯是建立一个独立的工作目录,比如:

~/projects/mcscanx_analysis/

把输入基因组数据、比对文件、输出结果都放在这个目录下,环境里只有软件,目录里只有数据,各司其职,互不干扰。这样不仅安全,后面做多组样本重复分析的时候,目录结构也清晰得多。

5. 常见问题排查实录:从激活报错到编译失败

5.1 conda activate报错/命令找不到

这个问题在2.2小节提到过,但实际使用中它出现的频率实在太高,我把它列进排查清单里再说一遍。

症状一:执行conda activate mcscanx时提示conda: command not found。排查思路是先确认shell有没有加载conda初始化配置,执行source ~/.bashrc看是否恢复,如果依然不行,就检查~/.bashrc里的conda init配置块是否还在。

症状二:执行conda activate时提示CommandNotFoundError,这时候就直接按提示初始化:

conda init bash exec bash

症状三:激活之后发现which MCScanX仍然找不到程序。那大概率是你激活之前忘了把当前目录切换到环境,或者你在另一个终端里没有重新激活环境。

5.2 依赖冲突与通道优先级问题

如果你在安装MCScanX的时候看到Analyzing conflict或者PackagesNotFoundError,十有八九是通道配置的问题。

先用这个命令检查自带通道顺序:

conda config --show channels

正常的顺序应该是我在2.3小节里配置的国内镜像地址,conda会从list靠前的通道开始找包。如果你看到列表里有defaults排在前面,那你就需要把它移到最后:

conda config --remove channels defaults

另外,如果通道优先级没有设置成strict,bioconda和conda-forge之间可能会出现同一个包不同版本的混乱。我的建议是一律conda config --set channel_priority strict,确保conda严格按照自定义顺序解析,避免它自动选择较低的版本或混用通道。

还有一个常见情况:mamba和conda混用导致环境中某些包元数据冲突。这个我确实遇到过,解决办法是尽量不要在同一个环境里一会儿用conda装、一会儿用mamba装,虽然大部分时候没事,但混到某个临界点环境就起来了。

5.3 运行MCScanX时的经典报错

MCScanX跑起来之后的报错,最常见的有以下几种。

第一种,缺少输入文件。MCScanX的输入是BLAST的tab格式比对结果和对应的gff文件。如果你是手动构造输入,很容易因为列的tab分隔符不对而报错。报错信息通常会提示输入格式不符,这时候用head -n 5检查一下BLAST结果文件,确认是6列tab分隔的标准格式。

第二种,perl脚本报错,提示找不到某个模块。虽然conda环境理论上会帮你装好所有Perl依赖,但如果你运行的是自己额外下载的MCScanX其他版本,或者你手动从GitHub拉取了最新源码,有可能遇到环境里没有的特殊模块。这时候先确认你运行的Perl是环境里的:

which perl

如果输出的路径是~/miniconda3/envs/mcscanx/bin/perl,那基本没问题。如果显示的是/usr/bin/perl,说明你没有在conda环境里运行脚本,或者说环境道路径被系统覆盖了,回到5.1小节再检查一遍激活流程。

第三种,Java相关报错。MCScanX的downstream_analysis里有些程序是Java写的,如果你服务器上没有装Java运行时,会直接报java: command not found。解决办法也很简单:

mamba install -n mcscanx -c conda-forge openjdk

把这个补装进环境里就行。

写在最后的一点体会

我实际用下来最大的感受是:conda这套依赖管理方案在生信领域确实值得早点上手。它不只是解决一个问题,而是把一套“不会把系统搞乱”的思维带给了所有做分析的人。即使你最终用的不是MCScanX,而是其他的软件,只要记住“独立环境+yaml备份+不动安装目录”这三条原则,基本上就能在各类工具链搭建中少走很多弯路。

回过头来再看搭建MCScanX这件事本身,核心就一句话:找对工具(mamba)、配好源(清华镜像)、确定通道(conda-forge+bioconda)、一条命令建环境。我把踩过的坑都写出来了,照着做应该能一次跑通。后续如果你想接着做MCScanX的下游可视化,比如利用Java脚本画出共线性圈图,那又是一个可以单独写一篇长文的话题,今天就把基础搭建交付给你了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询