我有一个Python3脚本,使用subprocess.call
在目录中的大约2,300个输入文件上运行程序,每个输入文件有两个输出文件。我有这两个输出进入两个不同的目录。我想学习如何对我的脚本进行多处理,以便同时处理多个文件。我一直在阅读Python中的多进程库,但它可能太高级,我不能理解。如果专家有任何意见,下面是脚本。非常感谢!
脚本:
import os
import subprocess
import argparse
parser = argparse.ArgumentParser(description="This script aligns DNA sequences in files in a given directory.")
parser.add_argument('--root', default="/shared/testing_macse/", help="PATH to the input directory containing CDS orthogroup files.")
parser.add_argument('--align_NT_dir', default="/shared/testing_macse/NT_aligned/", help="PATH to the output directory for NT aligned CDS orthogroup files.")
parser.add_argument('--align_AA_dir', default="/shared/testing_macse/AA_aligned/", help="PATH to the output directory for AA aligned CDS orthogroup files.")
args = parser.parse_args()
def runMACSE(input_file, NT_output_file, AA_output_file):
MACSE_command = "java -jar ~/bin/MACSE/macse_v1.01b.jar "
MACSE_command += "-prog alignSequences "
MACSE_command += "-seq {0} -out_NT {1} -out_AA {2}".format(input_file, NT_output_file, AA_output_file)
# print(MACSE_command)
subprocess.call(MACSE_command, shell=True)
Orig_file_dir = args.root
NT_align_file_dir = args.align_NT_dir
AA_align_file_dir = args.align_AA_dir
try:
os.makedirs(NT_align_file_dir)
os.makedirs(AA_align_file_dir)
except FileExistsError as e:
print(e)
for currentFile in os.listdir(args.root):
if currentFile.endswith(".fa"):
runMACSE(args.root + currentFile, args.align_NT_dir + currentFile[:-3]+"_NT_aligned.fa", args.align_AA_dir + currentFile[:-3]+"_AA_aligned.fa")
答案 0 :(得分:0)
子流程函数在单独的进程中运行任何命令行可执行文件。你正在运行java。多处理在单独的进程中运行python代码,就像线程在单独的线程中运行python代码一样。这两者的API有意相似。因此,多处理不能替代非python子进程调用。
使用多个python进程启动多个java进程将浪费进程。您也可以使用多个线程进行多个子进程调用。或者使用异步模块。
或制作自己的日程安排程序。在生成器函数中包含for-if。
def fa_file(path):
for currentFile in os.listdir(path):
if currentFile.endswith(".fa"):
yield currentFile
fafiles = fa_file(arg.root)
制作10个Popen对象的数组。睡一段合适的间隔。唤醒后,循环遍历数组并替换完成的子进程(.poll()返回除None之外的其他内容),只要next(fafiles)返回一些东西。
编辑:如果您在Python代码中执行了调用已编译C代码(例如,枕头)的图像处理,那么您可以使用多处理和加载文件的队列来处理。