2017-02-09 6 views
1

pythonスクリプトからqsubにタスクを割り当てようとしています。Python:サブプロセスでエコーする

は、これまでのところ、私はいつものqsub提出するため、このような表現を使用されています:

echo "python script.py arg1 arg2" | qsub 

私はpythonでこのコマンドを再現してみました:

command = 'echo "python sub_master_script.py ' + str(i) + ' ' + path + '" | qsub -pe make 5 -N Teaching_' + str(i) + ' -cwd' 
subprocess.call(shlex.split(command)) 

commandは私が通常使用するコマンドを運びますが、私はPythonスクリプトを起動すると、単純なechoと解釈されます。

、代わりに新しいジョブを開始する

、私はこれがコンソールに書き込まれます:

python sub_master_script.py 0.75 /data5/bio/runs-galkin/Iterative/test_OTU.txt | qsub -pe make 5 -N Teaching_0.75 -cwd 

この問題が発生したのはなぜ?どうすればそれを動作させることができますか?

答えて

2

あなたはシェル機能を大量に使用していますが、主に2つのプロセスをパイプして実行します。

subprocess.call(shlex.split(command),shell=True) 

はクイックフィックスです。それをやっての

適切な方法は、(echo python ...をシミュレートするため)及び(チャールズが必要な場合は、文字列が適切に引用されていることを確認するために、コメントとしてpipes.quoteを使用して)shell=Trueをドロップcommunicate介して入力を提供し、1つのsubprocess.Popenインスタンスを使用することです

import pipes 
input_string = "python sub_master_script.py {} {}\n".format(*(map(pipes.quote,[str(i),path]))) 

p = subprocess.Popen(['qsub','-pe','make','5','-N','Teaching_{}'.format(i),'-cwd'],stdin=subprocess.PIPE) 
out,err = p.communicate(input_string) 
+0

これは、 'i'と' path'が引用/エスケープする必要のない文字列であることを前提としています。値を準備するために 'pipes.quote()'を使うことはより安全です(但し、OPの元のシェルコマンドは全く同じ方法で安全ではない/バグです)。 –

+0

@CharlesDuffy素敵なアドオン。編集されました。 –

+0

あなたの解決策を試してみましたが、 'TypeError:__init __()に予期しないキーワード引数 'input''がありました ' subprocess.Popen(command、shell = True、stdout = subprocess.PIPE、stderr = subprocess.STDOUT) '正常に動作します。私は 'shell = True'で何が間違っているのか分からないので、私は残しておきます – lotrus28

関連する問題