2017-06-12 88 views
0

相同的命令多個文件我有一個像下面這樣的蟒蛇命令:運行在Linux中

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

不過,我有90個文件,我想執行相同的命令。 所有文件擴展名都是.fasta,並且每個輸出文件應放置在特定的文件夾中。

反正我可以一次執行命令嗎?

+0

是的,當然有辦法做到這一點。這些都必須同時執行,還是隻是試圖保存輸入?你在什麼操作系統上?是否有一些模式將每個文件映射到其目標文件夾? – Chris

+0

請注意,[tag:batch-file]標籤與DOS/Windows批處理文件相關,它與Unix無關;所以請重新考慮並編輯標籤... – aschipfl

+0

[此帖](https://stackoverflow.com/a/30492833/6805091)可能會有所幫助。 – Ding

回答

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。