我有一个如下的python命令:
pick_closed_reference_otus.py -i **your_seq.fasta** -o **your_folder_name**
-i: input files
-o: output folder
但是,我有90个文件,我想执行相同的命令。
所有文件扩展名都是.fasta
,每个输出文件都应放在特定的文件夹中。
无论如何我会立刻执行命令吗?
答案 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。