在Linux中使用相同的命令运行多个文件

时间:2017-06-12 17:17:17

标签: python batch-file

我有一个如下的python命令:

pick_closed_reference_otus.py -i **your_seq.fasta** -o **your_folder_name**
-i: input files
-o: output folder

但是,我有90个文件,我想执行相同的命令。 所有文件扩展名都是.fasta,每个输出文件都应放在特定的文件夹中。

无论如何我会立刻执行命令吗?

1 个答案:

答案 0 :(得分:0)

您的程序内部,我将假设您正在打开输入文件。所以当你解析参数时为什么不允许使用通配符? glob module就是你想要的。它将需要一个字符串并将其转换为列表文件路径,然后在您的程序中,您可以循环它们(或者使用multiprocess并行运行它们。

以下是它的工作原理。 (我假设您正在使用argparse从命令行获取参数...)

import glob
import argparse
import sys
from multiprocessing import Pool, cpu_count

def your_mappable_function(filename):
    print filename.upper()


#parse the command line   
parser = argparse.ArgumentParser(description='Example argparse')
parser.add_argument('-i', action="store", type=str)
parser.add_argument('-o', action="store", type=str)
args = parser.parse_args()

#glob to get the files from the wild card
input_file_list = glob.glob(args.i)

#use multiprocessing pool to process files in parallel
pool = Pool(cpu_count())
#results = map(your_mappable_function, input_file_list)
results = pool.map(your_mappable_function, input_file_list)

sys.exit(0)

如果您需要有关这些模块的教程,请查看Python Module of the Week。它涵盖了所有这些工具(以及更多)。您只需更换""" your_mappable_function"""使用一个函数包装器,它将一个文件名作为输入,你应该很高兴。这比bash脚本更快,因为它不必启动和停止python进程,直到映射完整个列表。

编辑: 当我回去确保代码运行时,我添加了一个函数包装器,以及一种在没有进程池的情况下测试代码的方法。因为,每当你搞乱一个游泳池,它就可以接管你的终端上的一个bug。