SSH环境下Python虚拟环境安装NumPy后无法导入求助
解决NumPy multiarray扩展模块导入失败的问题
我帮你梳理下这个问题——从你提供的安装日志、错误栈和脚本来看,虽然NumPy安装日志显示成功,但核心的multiarray扩展模块加载失败,大概率是虚拟环境未正确激活或者路径冲突导致的,以下是一步步的解决办法:
一、先确认虚拟环境是否激活
你提到创建了Python3虚拟环境,但看你的PBS脚本,并没有激活虚拟环境的命令!如果直接用系统的Python运行脚本,它会优先找全局的包,而不是你装在.local里的NumPy,这就会导致路径混乱。
- 解决:在PBS脚本的
export PYTHONPATH之前,加上虚拟环境的激活命令,把路径换成你实际创建的虚拟环境路径:source /panhome/me/your_venv_name/bin/activate
二、清理PYTHONPATH的冲突设置
你在PYTHONPATH里同时添加了本地的site-packages和系统的/usr/lib/python3/dist-packages/,这会让Python同时从多个路径找包,很容易出现版本冲突。
- 解决:激活虚拟环境后,完全不需要手动设置PYTHONPATH,虚拟环境会自动帮你管理包的搜索路径。把PBS里的
export PYTHONPATH那行注释掉就行。
三、在虚拟环境内重新安装依赖
之前的NumPy可能是在虚拟环境外安装的,或者安装时缺少编译依赖(SSH服务器上装NumPy需要gcc、gfortran这些工具),导致扩展模块没编译成功。
- 步骤:
- 先激活虚拟环境,然后完全卸载NumPy和Matplotlib:
pip uninstall -y numpy matplotlib - 如果有sudo权限,先装系统级的编译依赖(没有的话联系服务器管理员):
# Debian/Ubuntu系统 sudo apt-get install gcc gfortran python3-dev # CentOS/RHEL系统 sudo yum install gcc gcc-gfortran python3-devel - 回到虚拟环境,重新安装适配Python3.5的NumPy和Matplotlib(1.14.3版本太老了,换个稳定的兼容版本):
pip install numpy==1.18.5 matplotlib
- 先激活虚拟环境,然后完全卸载NumPy和Matplotlib:
四、验证NumPy是否安装正常
激活虚拟环境后,运行Python交互模式测试:
import numpy print(numpy.__version__) print(numpy.__file__)
如果能正常输出版本和虚拟环境内的路径,说明安装没问题,再运行脚本就不会报错了。
五、关于Matplotlib的后端设置
你的脚本里已经加了matplotlib.use('Agg'),而且放在导入pyplot之前,这部分是对的——SSH环境没有图形界面,必须用无显示后端,不用改这部分。
修改后的PBS脚本参考
#PBS -S /bin/bash #PBS -l nodes=1:ppn=8 #PBS -e /pandata/me/LEPIWASP/blast_database/tax_name_candidates_sp1.error #PBS -o /pandata/me/LEPIWASP/blast_database/tax_name_candidates_sp1.out #PBS -q q1hour #PBS -N tax_name_candidates_sp1 # 激活你的虚拟环境(替换成实际路径) source /panhome/me/your_venv/bin/activate # 注释掉原来的PYTHONPATH设置,虚拟环境会自动处理 # export PYTHONPATH=$PYTHONPATH:/panhome/me/.local/lib/python3.5/site-packages:/usr/lib/python3/dist-packages/ diamond_tab_output=/pandata/me/LEPIWASP/blast_database/matches.m8 Diamond_blast_to_taxid=/pandata/me/LEPIWASP/blast_database/public_scripts-master/Diamond_BLAST_add_taxonomic_info/Diamond_blast_to_taxid.py taxid=/pandata/me/LEPIWASP/blast_database/gi_taxid_prot.dmp categories=/pandata/me/LEPIWASP/blast_database/categories.dmp names=/pandata/me/LEPIWASP/blast_database/names.dmp description=/pandata/me/LEPIWASP/blast_database/acc_to_des.tab $Diamond_blast_to_taxid -i $diamond_tab_output -t $taxid -c $categories -n $names -d $description -o outfile_sp1.tab
内容的提问来源于stack exchange,提问作者Grendel




