4

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

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

我正在运行,Windows 7 和 Python 2.7。

执行此操作的命令行是什么?(蟒蛇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

4 回答 4

7

如果你走这条路,你就会进入windows shell编程,而没有人这样做。(我的意思是有人这样做,但他们是一个非常小的群体。)

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

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)

这将创建一个目录,并将您的命令作为该目录中的单独进程运行。由于在启动另一个子进程之前它不会等待子进程完成,因此这提供了您想要的并行性。


串联版本只是在启动另一个子进程之前等待。在循环末尾添加一行:

    p = Popen(cmd, shell=True, cwd=newpath)
    p.wait()
于 2012-08-05T17:52:37.403 回答
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\\to\\abc.py”

于 2012-08-05T18:53:53.867 回答
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/... 之类的路径;所以最后你需要在commandline.txt中将\更改为/,并将i:更改为/i,然后再将其并行化。

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

于 2012-08-07T11:48:47.913 回答
1

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

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

例如,它提供了一个 Pool 类,用于实现典型的工作模式,其中数据由 1..N 个工作人员并行处理。

“不是程序员”在这里毫无意义——与其修补,不如通过重用现有的 Python 模块来考虑更好的实现。写作和修改写在上面的东西通常没有多大帮助。

于 2012-08-05T17:50:08.787 回答