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

在python脚本中并行运行多个作业,python,parallel-processing,bioinformatics,Python,Parallel Processing,Bioinformatics,我不是一个程序员,因此简单的答案将不胜感激。我是医学博士,参与了一个生物信息学项目 假设我有一个Python脚本,abc.py,还有一个文本文件,commandline.txt,其中有113条命令行,每行1条,用于并行运行该脚本。我希望每个作业都运行在自己的名为scatter.001、scatter.002等目录中,scatter.113(每个文件只有一个唯一的编号),将在我执行脚本的目录中创建 我正在运行Windows7和Python2.7 执行此操作的命令行是什么?(python xyz\a

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

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

我正在运行Windows7和Python2.7

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

附言:


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

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

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


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

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

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

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()

此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”

GNU Parallel正是为此类任务而设计的。因此,如果您在GNU/Linux上运行,您只需执行以下操作:

cat commandline.txt | parallel bash -c "mkdir scatter.{#}; cd scatter.{#}; python ../abc.py {}"
由于您是在Microsoft Windows 7上运行的,因此在运行上述操作之前,还需要执行一些步骤

首先安装CygWin,这将为您提供一个基本的类UNIX环境

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

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
CygWin更喜欢像/I/Exome/Invex/这样的路径。。。;因此,最后,在将其交给parallel之前,您需要将commandline.txt中的\into/和i:into/i进行更改

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


观看GNU Parallel的介绍视频了解更多信息:

谢谢。我正在试着运行这个程序。他们明确表示,这些进程必须并行运行。@Shyam_LA:有密码。如果可以的话,把它写在gist上。我们正在讨论的脚本“InVEX.py”可能需要几天的执行时间;正如你所猜测的,不少于一秒钟。@Shyam_LA:谢谢你的更新。我将发布我能写的最简单的并行代码。@Shyam\u LA:您想要的函数是
os.remove
。只需在进程结束后调用它(在
wait()
之后)。请看:如果您还需要什么,请随时给我发电子邮件。重写代码始终是一种选择,修补永远不是您的选择。我的理解是我将这些行复制到一个新文件中。使用.py扩展名保存它,然后通过命令提示符执行它。但是,如何让这个脚本调用原始的“abc.py”?它的行文中似乎没有提及原始脚本。。请澄清一下。我明白了——commandline.txt包含要传递给脚本的参数,而不是完整的命令。我会更新答案的。谢谢。这确实创建了114个(从000开始)具有上述名称的目录。但是abc.py真的没有继续。。它冻结为“溢出错误:无法将'long'放入索引大小整数”您知道问题是什么吗?很可能是abc.py中的错误。。你可能需要找一个程序员。或者更好的是,学习一些python:)所有114个进程是否都以相同的错误结束?有可能是因为提供的参数不正确。您可以尝试手动调用这些命令,以查看是否出现相同的错误。是否存在包含
bash-c
的原因?之所以需要,是因为commandline.txt中的行包含多个参数。GNU Parallel将把每一行都当作一个参数,因此引用空格。在这种情况下,我们希望空格分隔参数。因此,我们需要bash-c来解压缩参数。
perl -pe 's{(.):}{/$1}g;s{\\}{/}g;' commandline.txt | parallel bash -c "mkdir scatter.{#}; cd scatter.{#}; python ../abc.py {}"