Linux下实现 psi-blast 的多进程并批量生成 pssm 文件

0. 说明:

在 Linux 通过 Python 的多进程模块实现 psi-blast 的并行,批量生成 pssm 文件。

1. 代码:

import subprocess
import multiprocessing
import time
import os

def runPsiBlast(args):
    queryFile, dbFile, outFile = args[0], args[1], args[2]
    cmd = f"./psiblast -query {queryFile} -db {dbFile} -out_ascii_pssm {outFile} -num_iterations 3 -evalue 0.001"
    subprocess.run(cmd, shell=True)


def main(queryPath, outPath, dbFile, cpu):
    """
        queryPath: query fasta文件所在的绝对路径;
        outPath: 生成的 pssm 文件所在的绝对路径;
        dbFile: 库文件(需要绝对路径);
        cpu: 并行所需的 cpu 数目;
    """
    queryFileList = [x.split(".")[0] for x in os.listdir(queryPath) if x.endswith(".fasta")] ## 全部的目标fasta文件
    alreadyFileList = [x.split(".")[0] for x in os.listdir(outPath) if x.endswith(".pssm")] ## 输出目录中已经存在的pssm结果文件(主要是如果程序中止,后续可以接着将没有pssm结果的fasta继续进行psiblast比对,不需要全部重新运行)
    needFileList = list(set(queryFileList) - set(alreadyFileList))
    print("全部的fasta文件的总数: %s\t已经有pssm结果的文件数目: %s\t还需要生成pssm的fasta文件的数目: %s" % (len(queryFileList), len(alreadyFileList), len(needFileList))) ## 全部的,已完成的,未完成的
    
    needFileList.sort()
    queryFastaList = [queryPath+x+".fasta" for x in needFileList]
    outPSSMList = [outPath+x+".pssm" for x in needFileList]
    dbFileList = [dbFile,]*len(queryFastaList)
    
    ## 多进程
    pool = multiprocessing.Pool(processes=int(cpu))
    pool.map(runPsiBlast, list(zip(queryFastaList, dbFileList, outPSSMList)))
    pool.close()
    pool.join()


if __name__ == "__main__":
    print("开始时间: ",time.ctime())
    
    queryPath = "/home/zzy/QueryFastaFiles/" ## fasta 文件所在目录
    outPath = "/home/zzy/ResPSSMFiles/" ## 输出的 pssm 文件所在目录
    dbFile = "/home/zzy/Uniref90/uniref90.fasta" ## 库文件所在目录
    
    main(queryPath=queryPath,
         outPath=outPath,
         dbFile=dbFile,
         cpu=4) ## 默认4个cpu
    
    print("结束时间: ",time.ctime())

你可能感兴趣的:(生信,psi-blast,并行,批量生成,linux,python)