在python脚本中并行运行多个作业

时间:2012-08-05 17:45:40

标签: python parallel-processing bioinformatics

我不是程序员,因此简单的答案将不胜感激。我是医学博士,参与了生物信息学项目。

假设我有一个Python脚本,abc.py我有一个文本文件,commandline.txt有113个命令行,每行1个,这个脚本可以并行运行。我希望每个这些作业都在其自己的目录中运行,该目录名为scatter.001,scatter.002,...,scatter.113(每个只有一个唯一的编号),要在我执行的目录中创建脚本来自。

我正在运行,Windows 7使用Python 2.7。

执行此操作的命令行是什么? (python xyz \ abc.py .......)

PS:

-p 100 -m 10000000 -e 10 -k I:\Exome\Invex\analyses\PatientSet.load_maf.pkl ,UBE2Q1,RNF17,RNF10,REM1,PMM2,ZNF709,ZNF708,ZNF879,DISC1,RPL37,ZNF700,ZNF707,CAMK4,ZC3H10,ZC3H13,RNF115,ZC3H14,SPN,HMGCLL1,CEACAM5,GRIN1,DHX8,NUP98,XPC,SP4,SP5,CAMKV,SPPL3,RAB40C,RAB40A,COL7A1,GTSE1,OVCH1,FAM183B,KIAA0831,SPPL2B,ITGA8,ITGA9,MYO3B,ATP2A2,ITGA1,ITGA2,ITGA3,ITGA5,RIT1,ITGA7,TRHR,LOC100132288,DENND4A,DENND4B,TAP2,GAP43,PAMR1,HRH2,HRH3,HRH1,FBXL18,FAM169B,GHDC,SDK1,SDK2,THSD4,THSD1,ZFP161,CHST8,COL4A5,COL4A4,COL4A3,COL4A2,COL4A1,CHST1,CHST5,CHST4,ITGAX I:\Exome\Invex\analyses\First7.final_analysis_set.maf I:\Exome\Invex\temp\unzipped_power_files First7 I:\Exome\Invex\analyses\First7.individual_set.txt I:\Exome\Invex\hg19.fasta I:\Exome\Invex\hg19_encoded_by_trinucleotide.fasta I:\Exome\Invex\TCGA.hg19.June2011.gaf I:\Exome\Invex\hg19 I:\Exome\Invex\pph2_whpss_reduced I:\Exome\Invex\cosmic_num_times_each_chr_pos_mutated.tab

这是commandline.txt中一行的示例。我在文件中有113条这样的行..

4 个答案:

答案 0 :(得分:6)

如果你这样做,你将进入windows shell编程,没有人这样做。 (我的意思是有人这样做,但他们是一个非常小的团体。)

如果您编写第二个python脚本循环遍历要传递给第二个脚本的参数,并使用这些参数调用functoin,这将是最简单的。

from subprocess import Popen
from os import mkdir

argfile = open('commandline.txt')
for number, line in enumerate(argfile):    
    newpath = 'scatter.%03i' % number 
    mkdir(newpath)
    cmd = '../abc.py ' + line.strip()
    print 'Running %r in %r' % (cmd, newpath)
    Popen(cmd, shell=True, cwd=newpath)

这将创建一个目录,并将该命令作为该目录中的单独进程运行。因为它不会在启动另一个子进程之前等待子进程完成,所以这给出了你想要的并行性。


在启动另一个子进程之前,系列版本只是waits。 在循环结束时添加一行:

    p = Popen(cmd, shell=True, cwd=newpath)
    p.wait()

答案 1 :(得分:4)

这个python脚本应该并行执行:

import os, subprocess
n = 0
for cmd in open('commandline.txt'):
    newpath = 'scatter.%03d' % n 
    os.mkdir(newpath)
    subprocess.Popen("..\\abc.py " + cmd, shell=True, cwd=newpath)
    n += 1

请注意,这假定abc.py和commandline.txt位于同一目录中。 如果不是这种情况,则必须将字符串更新为" C:\\ path \\到\\ abc.py"

答案 2 :(得分:4)

GNU Parallel就是为了完成这类任务而制作的。因此,如果您一直在GNU / Linux上运行,那么您只需完成:

cat commandline.txt | parallel bash -c "mkdir scatter.{#}; cd scatter.{#}; python ../abc.py {}"

由于您在Microsoft Windows 7上运行,因此在运行上述步骤之前还需要几个步骤。

首先安装CygWin http://cygwin.com/setup.exe这将为您提供类似UNIX的基本环境。

然后启动CygWin并在CygWin下安装GNU Parallel:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel

CygWin喜欢/ I / Exome / Invex / ...等路径;所以最后你需要在将它并行之前将\更改为/和i:到/ i在commandline.txt中。

perl -pe 's{(.):}{/$1}g;s{\\}{/}g;' commandline.txt | parallel bash -c "mkdir scatter.{#}; cd scatter.{#}; python ../abc.py {}"

然后你就完成了。

观看GNU Parallel的简介视频,了解详情:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

答案 3 :(得分:1)

重写您的脚本以便使用Python的多处理模块。

http://docs.python.org/library/multiprocessing.html

它提供了例如用于实现数据所在的典型工作模式的Pool类 由1..N工人并行处理。

“不是程序员”在这里毫无意义 - 而不是通过重用现有的Python模块来思考更好的实现。写作和修补上面写的东西通常没什么帮助。