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())