1. 部署前的思路梳理:为什么Windows下装NUPACK这么麻烦
先说结论:NUPACK本身不是Windows原生软件。官方网站发布的预编译版本、源码包、Docker镜像,默认都是面向Linux和macOS的。很多第一次接触NUPACK的同学,在Windows上满怀期待地解压完压缩包,双击文件夹里的可执行文件,结果要么闪退,要么提示“不是有效的Win32应用程序”,然后就开始怀疑人生。
这个软件的全称是Nucleic Acid Package,核心做的是核酸序列的热力学分析和序列设计。具体来说,它能计算DNA/RNA二级结构的最小自由能、碱基对概率、配分函数、熔解温度,还能做复杂核酸复合物的序列设计。这些功能背后是一堆C++编译出来的底层计算程序,比如pfunc、mfe、pairs、subopt、complex、design等等。NUPACK 4.0之后又提供了Python接口,方便用脚本批量做分析和设计。
问题就出在这些C++程序上——它们是针对Linux ELF格式编译的二进制文件,Windows的命令行工具根本不认。所以你在Windows上装NUPACK,本质上只有两条路可以走:要么在Windows上跑一个完整的Linux环境(虚拟机、WSL、Docker容器都算),要么用Cygwin/MSYS2这类模拟层去迁就Linux程序,但后者坑非常多,我不推荐新手碰。
这篇教程的核心思路是:用WSL2(Windows Subsystem for Linux 2)在Windows系统里部署一个轻量级Ubuntu环境,然后把NUPACK完整地安装在这个Ubuntu环境里。WSL2和传统的虚拟机不一样,它不需要额外安装VMware或VirtualBox,Docker Desktop在Windows上跑Linux容器也依赖它。它跟Windows系统共享文件系统、剪贴板和网络,从Windows那边可以直接敲wsl命令进入Linux命令行,体验很接近原生Linux,性能损失比虚拟机小很多。
这个方案适合谁?适合所有用Windows做日常办公、但科研计算离不开Linux工具的科研人员。不管你是做DNA折纸、核酸探针设计,还是做RNA二级结构预测,只要需要在Windows上用NUPACK,都建议按这个方案走。整套操作下来大概30到60分钟,一次性配置好,后面长期使用很稳定。
2. 环境准备:WSL2、Ubuntu和基础依赖的安装配置
2.1 启用WSL2的两种方式与版本验证
安装WSL2有两种比较常见的方式。第一种是在“启用或关闭Windows功能”里勾选“适用于Linux的Windows子系统”和“虚拟机平台”,重启后再用管理员身份打开PowerShell执行wsl --install -d Ubuntu。第二种是直接在管理员PowerShell里执行wsl --install,这个命令会自动完成功能启用、内核更新并安装默认的Ubuntu发行版,不用手动勾选功能。
我用的是第二种方式,因为从Windows 11和较新的Windows 10版本开始,wsl --install已经很成熟了,一条命令干完所有事。装完之后重启电脑,系统会提示设置Linux用户名和密码——这个用户名不一定要和Windows用户名一致,它只是WSL环境里的账号,建议设一个自己记得住的。
安装完成后要确认WSL版本是2,因为只有WSL2才支持完整的Linux内核和Docker Desktop的后端依赖。在Windows PowerShell里执行:
wsl --status wsl -l -v如果输出显示Ubuntu的“VERSION”列是2,就说明正确启用了WSL2。如果显示1,可以手动转换:
wsl --set-version Ubuntu 2 wsl --set-default-version 22.2 Ubuntu源更换与基础开发工具安装
进入WSL环境后,我一般会先做三件事:更新软件源、升级系统包、安装编译NUPACK需要的开发工具。
sudo apt update sudo apt upgrade -y sudo apt install -y build-essential g++ gcc make cmake git python3 python3-pipbuild-essential这一套东西里包含了gcc、g++和make,NUPACK源码安装时会执行configure脚本并调用C++编译器,没有这些编译工具链是装不上的。git用于拉取NUPACK源码仓库,如果你选择直接下载源码压缩包,git可以不安,但建议还是装一个,方便以后更新版本。
要注意的是,国内网络环境下Ubuntu默认的软件源下载速度可能很慢。我在实际安装NUPACK依赖时改过几次源,建议把/etc/apt/sources.list里的archive.ubuntu.com替换为清华或阿里云的镜像地址,具体替换方式网上教程很多,这里不展开。替换完记得执行sudo apt update再继续。
2.3 Miniconda在WSL里的安装与Python环境隔离
NUPACK 4.0之后的Python接口要求Python 3.9以上的版本,而且它的Python包和底层C++程序是分开管理的。为了避免污染系统自带的Python环境,我强烈建议在WSL里装一个Miniconda,用conda单独创建NUPACK的运行环境。
下载Miniconda安装脚本:
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中一路按回车同意协议,最后问是否初始化conda时选yes。装完重新打开终端,conda就能正常使用了。创建一个NUPACK专用的环境:
conda create -n nupack python=3.11 -y conda activate nupack这里我选了Python 3.11,实测NUPACK 4.0在3.11和3.10上都没问题。不要用Python 3.13或更新的版本,NUPACK 4.0发布时还没有适配那么新的Python,有些依赖包会找不到兼容版本。
2.4 Docker方案的备选说明
如果你的环境比较特殊,比如公司电脑政策限制导致WSL启用困难,也可以考虑用Docker Desktop跑一个NUPACK容器。Docker Desktop在Windows上默认依赖WSL2后端,所以最终还是绕不开WSL。如果用的是比较老旧的Docker Toolbox,那还要处理VirtualBox,链路更长,不建议。
Docker方案的真实使用场景是:你想把NUPACK环境打包成一个镜像,分发给实验室的其他成员,保证每个人拿到的环境完全一致。这时候可以基于Ubuntu镜像自己写一个Dockerfile,把编译好的NUPACK复制进去,然后统一分发。日常个人使用,WSL2的方案已经绰绰有余。
3. NUPACK源码获取与本地编译安装全流程
3.1 许可证申请与源码下载
NUPACK自4.0版本开始需要许可证才能使用。许可证是免费的,学术用户填写姓名、学校邮箱、使用用途就能获得。去NUPACK官网找到许可证申请页面,提交后会收到一封包含许可证文件的邮件,文件名一般是nupack_license.txt或类似格式。
许可证的原理是绑定你的用户信息,生成一个key文件,NUPACK在运行时会读取这个文件来校验使用权限。所以在源码安装之前,提前把这个文件准备好,后面会直接用到。
源码下载有两条路:一是从GitHub仓库克隆,二是直接下载官方发布源码包。我在GitHub上遇到过主分支代码和最新稳定版本不一致的情况,所以更推荐下载官方release源码包,版本号明确,文档对应也比较准。把源码包放到WSL的home目录下:
cd ~ wget https://github.com/nupack/nupack/releases/download/v4.0.0/NUPACK-4.0.0.tar.gz tar -xzf NUPACK-4.0.0.tar.gz cd NUPACK-4.0.0如果你的网络下载GitHub比较慢,可以从国内镜像站获取源码包,或者换用conda来安装:
conda install -c bioconda nupackconda安装的好处是省去了编译步骤,缺点是不一定能装到最新版本,而且许可证文件还是要手动放好。两条路我实测都能用,但为了让读者理解NUPACK的运行机制,下面先用源码编译的完整流程来讲解。
3.2 configure脚本的参数选择与执行
NUPACK源码目录下有一个configure脚本,它的作用是根据你指定的编译器、安装路径、Python版本等信息生成编译配置。执行最简配置:
./configure --prefix=$HOME/nupack_install这里--prefix指定安装目录,不指定的话默认会装到系统目录,普通用户没有写权限就会失败。configure执行时还会检查你的gcc/g++版本是否满足要求,检查Python环境。如果缺少某个依赖,configure会直接报错并提示你安装。
我在执行configure时遇到过一个问题,就是系统装了多个gcc版本,configure默认选了老版本的gcc导致编译失败。解决办法是显式指定编译器:
CC=gcc-12 CXX=g++-12 ./configure --prefix=$HOME/nupack_install具体gcc版本用gcc --version查一下,NUPACK 4.0要求gcc 8以上的版本,一般Ubuntu 22.04/24.04自带的gcc-11或gcc-12都能满足要求。
3.3 make与make install的编译流程
配置完成后就是标准的编译安装流程:
make -j$(nproc) make install-j$(nproc)表示用CPU的全部核心并行编译,NUPACK源码体积不大,但编译多个分析程序还是要花几分钟的。编译过程中会看到大量C++编译日志,这很正常,不用慌。出现error: xxx was not declared in this scope这类报错,多半是编译器版本太老或者缺失依赖库,回退检查依赖即可。
make install执行完后,所有可执行文件会被安装到$HOME/nupack_install/bin目录下。查看一下安装结果:
ls $HOME/nupack_install/bin正常情况下能看到pfunc、mfe、pairs、subopt、complex、design、utils等一批程序。其中design程序是序列设计模块,它内部还会调用pfunc和pairs来评估候选序列的折叠行为。
3.4 许可证文件的放置位置与Python包安装
NUPACK运行时会去安装目录下找许可证文件。把之前申请到的nupack_license.txt复制到安装根目录或源码目录下,具体位置在configure时会定义。我实际安装时是放在安装根目录下的:
cp nupack_license.txt ~/nupack_install/判断许可证有没有放对位置,可以直接跑一个最简单的热力学分析命令验证。如果报错提示找不到许可证,就用find ~/nupack_install -name "*license*"查一下文件路径,把它挪到软件根目录即可。
接着安装Python接口。4.0版本提供的是nupack这个Python库,在源码目录下执行:
pip install . --no-build-isolation cd ~然后验证Python接口:
python -c "import nupack as nk; print(nk.__version__)"能打印出版本号,就说明Python接口安装成功了。注意这里一定要在之前创建的nupack conda环境里执行pip install,否则会装到系统Python里,环境隔离就失效了。
3.5 实用验证:用pfunc快速跑通一个最小案例
安装完成后,最直观的验证方式是找一个寡核苷酸序列做热力学分析。手动编辑一个序列文件:
mkdir -p ~/nupack_test && cd ~/nupack_test echo "ACGTTGCAACGTTGCA" > test.seq调用pfunc计算这个序列在37度下的配分函数和熔解特性:
~/nupack_install/bin/pfunc -T 37 testpfunc命令的参数格式是pfunc [选项] <序列文件名前缀>,不需要写.seq后缀。输出会包含自由能变化、熔解温度等参数。如果看到自由能相关的数字正常输出,说明这个NUPACK已经完整可用了。
4. 三条可选的部署路线对比,以及我为什么推荐WSL
4.1 原生编译、Docker容器、虚拟机三种方案的优劣
在Windows上本地部署NUPACK,实际上是三种主流方案在竞争:WSL2编译安装、Docker容器、传统虚拟机。我实际把三种方案都试过,把它们的对比整理成了表格:
| 方案 | 安装复杂度 | 性能损耗 | 文件共享便利性 | 适合场景 |
|---|---|---|---|---|
| WSL2 + 源码编译 | 低 | 很低 | 高,直接访问Windows文件 | 个人日常科研使用 |
| Docker容器 | 中 | 低 | 中,需配置volume挂载 | 需分发统一环境给多人 |
| VMware/VirtualBox虚拟机 | 高 | 高 | 中,需配置共享文件夹 | 需要完整图形界面的边缘场景 |
选择WSL2作为主推方案,核心原因是它的性能和与Windows的交互体验最好。NUPACK的序列设计任务在人体DNA折纸这类项目里可能涉及大量序列组合的计算,虚拟机额外的性能开销会导致设计时间明显变长。而WSL2直接运行在真实Linux内核之上,性能接近宿主机。
4.2 Windows原生安装思路的说明
有些同学可能看到NUPACK目录里有.exe文件或者Python脚本,就想直接在Windows cmd/PowerShell里跑。确实,NUPACK 4.0的Python包理论上可以pip安装,但底层的pfunc、mfe等核心程序在Windows下没有官方预编译版本,导致Python包虽然装上了,一调用计算核心就报错。
我把这个情况专门拎出来说,是想让读者少走弯路。NUPACK的架构是“Python前端调用C++计算核心”,只要Windows上没有对应的C++核心,前端装得再完整也是空壳。除非你用Cygwin把所有Linux二进制重新编译一遍,否则原生Windows安装这条路在当前版本的NUPACK下是走不通的。
4.3 安装目录与PATH环境变量的最佳实践
装完NUPACK后,每次都输完整路径肯定不现实。我建议把bin目录加入PATH:
echo 'export PATH="$HOME/nupack_install/bin:$PATH"' >> ~/.bashrc echo 'export NUPACKHOME="$HOME/nupack_install"' >> ~/.bashrc source ~/.bashrcNUPACKHOME这个环境变量很重要。NUPACK的Python接口会通过它来定位底层C++程序,如果没有设置,运行时会提示找不到核心计算程序。这样配置完后,直接在命令行输入pfunc -T 37 test就能执行,不用带路径前缀。
同时,建议把conda的nupack环境设为默认激活,这样每次打开WSL终端,Python环境自动就是NUPACK专用的,不会混淆:
echo 'conda activate nupack' >> ~/.bashrc source ~/.bashrc5. 常见问题与排查技巧实录
5.1 configure阶段报错:compiler not found 或版本过旧
集中发生在只装了系统自带Ubuntu、没有安装build-essential的情况下。执行sudo apt install -y build-essential g++ gcc make后重试即可。如果是编译时提示gcc版本太低,先查看当前版本:
gcc --versionUbuntu仓库里通常有多个gcc版本可以直接安装,比如sudo apt install gcc-12 g++-12,然后按照前面提到的CC/CXX参数指定新版编译器。我见过不少同学卡在这一步,其实多装一个开发包就解决了。
5.2 编译过程中c++头文件找不到
NUPACK源码中有些头文件需要额外的开发库支持。典型报错是fatal error: vector: No such file or directory。这说明系统缺少libstdc++开发头文件,执行:
sudo apt install -y libstdc++-12-dev有些情况还需要安装libopenmpi-dev或libomp-dev,这取决于源码是否启用了并行计算选项。我的建议是安装编译依赖时一次性把常见开发库都装上,既省时间也避免反复失败。
5.3 运行时提示License not found或Licesne invalid
许可证文件放置位置不正确是最常见的原因。NUPACK搜索许可证的路径是安装根目录,不是当前执行目录。把许可证文件复制到$NUPACKHOME对应的目录下,确认文件名和官方要求完全一致。大小写不一致也会导致找不到,Linux对文件名大小写敏感,别把license和License搞混。
5.4 pfunc执行时提示无法定位输入文件
NUPACK的核心程序对输入文件格式的要求比较严格。序列文件必须是纯文本,一行放一个序列,文件命名不能包含空格或中文,最好也不要用Windows记事本编辑。记事本保存的文件默认带UTF-8 BOM头,NUPACK读取时会把BOM当成序列的一部分,导致解析失败。
如果需要在Windows下编辑序列文件,我建议用VS Code或Notepad++,保存时选择“UTF-8无BOM”编码。文件后缀为.seq,命令调用时只传前缀。举个例子,文件叫test.seq,执行命令就是pfunc -T 37 test。
5.5 从Windows访问到WSL里的NUPACK文件
日常使用中,序列文件或者设计结果可能需要放到桌面或Windows的其他目录。WSL2有一套\\wsl$\访问协议,在Windows资源管理器地址栏输入\\wsl$\Ubuntu\home\用户名\,就能像访问本地文件夹一样访问WSL里的目录。反过来,从WSL命令行访问Windows文件,路径是/mnt/c/Users/你的Windows用户名/Desktop。
不过强烈不建议把NUPACK安装在/mnt/c这类Windows盘符路径下,因为跨文件系统的读写性能比WSL内部慢很多。正确姿势是:源码和安装目录都放在WSL的home下,只有输入输出的序列文件和结果文件,通过\\wsl$\路径从Windows侧存取。
5.6 Docker Desktop无法启动或WSL内核过旧
如果选择Docker方案,启动Docker Desktop时提示“WSL2 kernel版本太低”,多半是WSL内核组件没有更新。在管理员PowerShell里执行:
wsl --update这个命令会升级WSL到最新内核版本,升级后重启Docker Desktop一般就能正常启动。另外,Docker Desktop的设置里要确保选择“基于WSL2的引擎”,而不是Hyper-V模式,毕竟我们一路都是围绕WSL2搭的环境。
6. 实战案例:用部署好的NUPACK做一次核酸序列热力学分析
装好了不等于会用了。我拿一个DNA双链杂交分析的真实场景,把NUPACK的典型用法串讲一遍,让大家知道这套环境装完到底能干什么。
假设有一个20bp的DNA序列,需要计算它和完全互补链在37度、盐浓度为1M NaCl条件下的杂交自由能,以及双链结构的熔解温度。序列是:GACTGACTGACTGACTGACT。
先把序列写入文件:
cd ~/nupack_test echo "GACTGACTGACTGACTGACT" > duplex_A.seq echo "AGTCAGTCAGTCAGTCAGTC" > duplex_B.seq然后创建一个NUPACK的Python脚本,调用Python接口来做完整的双链分析:
import nupack as nk # 定义模型参数:温度37度,钠离子浓度1M model = nk.Model(material='dna', celsius=37, sodium=1.0) # 定义两个单链 strand_a = nk.Strand('GACTGACTGACTGACTGACT', name='A') strand_b = nk.Strand('AGTCAGTCAGTCAGTCAGTC', name='B') # 创建双链复合物 complex_ab = nk.Complex([strand_a, strand_b], name='AB') # 计算配分函数和自由能 results = nk.pfunc(complex_ab, model=model) print(f"自由能变化: {results.free_energy:.2f} kcal/mol") # 计算碱基对概率 pair_probs = nk.pairs(complex_ab, model=model) # 预测熔解温度 melting_temp = nk.melting_temperature([strand_a, strand_b], model=model) print(f"熔解温度: {melting_temp.tm:.1f} °C")这段脚本覆盖了NUPACK Python接口最核心的四个功能:参数建模、配分函数计算、碱基对概率预测、熔解温度计算。实际运行一下,会看到输出自由能和熔解温度的具体数值。
对于做序列设计的人来说,更重要的是NUPACK的design模块。它可以自动设计符合目标结构的序列,比如输入一个目标二级结构点括号表示法,让NUPACK输出一组可行的DNA序列。源码目录下自带的示例文件里就有设计案例,我每次给实验室带新人都是用这些示例先跑通流程。
7. 写在最后的几条实操心得
这个流程我前后在至少五台不同的Windows电脑上部署过,踩过的坑基本都写在上面了。最后分享几个自己的习惯,可能对长期使用有帮助。
第一,永远在conda的nupack环境里操作。NUPACK的Python接口对依赖版本比较敏感,如果跟其他项目共用一套Python环境,很容易因为某个库版本冲突导致NUPACK静默失败。单独环境虽然多占一点磁盘空间,但省心程度高出一个数量级。
第二,把许可证文件备份一份到Windows侧的云盘。NUPACK重装时需要重新放置许可证文件,如果这台电脑坏了换新电脑,没有备份就得重新申请,虽然审核很快,但白等几个小时没必要。
第三,定期更新源码和Python包。NUPACK会修复一些热力学参数库的问题和序列设计的Bug,隔几个月去GitHub看一次release,有新版就拉下来重新编译。重新编译流程跟前面一样,configure、make、make install三步而已,Python包重新pip install一下,并不复杂。
第四,涉及大量批处理时,尽量用Python接口而不是直接调命令。NUPACK命令行的调用粒度是单条序列级别的,批量计算需要shell脚本做循环。而Python接口可以很方便地在内存中维护多个Strand和Complex对象,批量做热力学筛选的代码量会少很多,逻辑也更清晰。
NUPACK这种科研软件,装的时候确实比普通软件多花点功夫,但部署一次之后,后续的序列分析效率提升是实打实的。希望这次记录的WSL2部署流程,能让还没有跑通环境的同学少折腾几天。