4

私はプログラマーではないので、簡単な答えをいただければ幸いです。私は医学博士であり、バイオインフォマティクスプロジェクトに携わっています。

Pythonスクリプトがあり、このスクリプトを並行して実行するための、113のコマンドライン(各行に1つ)をabc.py含むテキストファイルがあるとします。commandline.txtこれらの各ジョブを、scatter.001、scatter.002、...、scatter.113(それぞれに固有の番号)という独自のディレクトリで実行し、実行しているディレクトリに作成する必要があります。からのスクリプト。

私はPython2.7を搭載したWindows7を実行しています。

これを行うためのコマンドラインは何ですか?(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の1行の例です。ファイルにはそのような行が113行あります。

4

4 に答える 4

7

このように進むと、誰もやらない Windows シェル プログラミングに取り掛かることになります。(誰かがやっているという意味ですが、彼らは非常に小さなグループです。)

2 番目のスクリプトに渡したい引数をループ処理し、それらの引数を使用して関数を呼び出す 2 番目の 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)

これにより、ディレクトリが作成され、そのディレクトリでコマンドが別のプロセスとして実行されます。別のサブプロセスを開始する前にサブプロセスが終了するのを待たないため、これにより必要な並列性が得られます。


インシリーズ バージョンは、別のサブプロセスを開始する前に待機するだけです。ループの最後に 1 行追加します。

    p = Popen(cmd, shell=True, cwd=newpath)
    p.wait()
于 2012-08-05T17:52:37.403 に答える
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 の multiprocessing モジュールを利用するために、スクリプトを書き直してください。

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

たとえば、データが 1..N ワーカーによって並列処理される典型的なワーカー パターンを実装するための Pool クラスを提供します。

ここでは「プログラマーではない」は無意味です。いじくり回す代わりに、既存の Python モジュールを再利用してより良い実装を考えてください。上に書かれたものを書いたりいじったりしても、通常はあまり役に立ちません。

于 2012-08-05T17:50:08.787 に答える