You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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这些工具),导致扩展模块没编译成功。

  • 步骤:
    1. 先激活虚拟环境,然后完全卸载NumPy和Matplotlib:
      pip uninstall -y numpy matplotlib
      
    2. 如果有sudo权限,先装系统级的编译依赖(没有的话联系服务器管理员):
      # Debian/Ubuntu系统
      sudo apt-get install gcc gfortran python3-dev
      # CentOS/RHEL系统
      sudo yum install gcc gcc-gfortran python3-devel
      
    3. 回到虚拟环境,重新安装适配Python3.5的NumPy和Matplotlib(1.14.3版本太老了,换个稳定的兼容版本):
      pip install numpy==1.18.5 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

火山引擎 最新活动