2012-04-03 14 views
1

私は、スクリプトのためにpythonでsubprocess.call演算子を使用するのが面倒な問題に直面しています。 パイプラインプログラム(bowtie)を複数回実行してから、さまざまな方法で出力を使用する必要があります。そのために、私はsubprocess.callを使用しています。Pythonでsubprocess.callを使用しているマルチファイルstdin(bowtie用)

問題は、bowtieが入力ファイル2つとインデックスとテキストファイルを取り込み、それらの両方をstdinパラメータに割り当てることができないという問題です。

私はargsにインデックスへのパスも含めようとしましたが、もちろんbowtieはそれをインデックスとして認識せず、エラーを出します。 Sincerこのインデックスは常に同じですが、この問題を回避する方法はありますか?ここで

は私は(非常に生)に取り組んでいるコードの一部です:

inpath = "/media/2tbhd/workdata/nanocage_noadapt/zf/fasta/zf_ad_c_r2.fasta" 
ind_path = "indexes/zf_gen_topl" 
for elem in plist: 
     cmd = subprocess.call(["bowtie","-f","-v 3", "--best" "--suppress 6,7" "-p 6"], shell = True, stdin = inpath, ind_path) 
+0

コマンドラインから 'bowtie'をどのように起動しますか?私が知っているプログラミング言語でstdinに2つのファイルを割り当てることはできません... – mgilson

+1

"もちろんbowtieはそれをインデックスとして認識せず、私にエラーを与えません" - それは特に何のエラーメッセージですか? –

+0

あなたが望む方法でbowtieを呼び出すプレーンシェルコマンドを書き、それが動作するかどうか確認してください。それがうまくいけば、ここに貼り付けると、それをsubprocess.call関数に変換する方法を助けてくれます。それがうまくいかない場合、私はあなたがボウタイで間違っていたことを考え出すことができます。 – weronika

答えて

0

私はbowtieについては何も知りませんが、あなたの呼び出しのようなものでなければならないことに私には思える:

cmd = subprocess.call(['bowtie','-f',inpath,'-v','3', '--best','--suppress','6,7','-p','6',ind_path]) 

通常、引数のリストをサブプロセスに渡すのは、コマンドライン上の引数と同じです。コマンドラインがどのように見えるか分かっているなら、素晴らしいshlexモジュールを使ってコマンドを分割することができます。例えば:あなたの入力ファイルが実際に(それはあなたの例のように見えるものである)ファイルではなく、いくつかの他のプロセスからのパイプされたデータであれば、私はあなたのサブプロセスにSTDINを使用する必要があります

import shlex 
import subprocess 
cmd=subprocess.call(shlex.split("ls -al")) 
0

とは思いません.call関数はまったく!
私が知る限り、通常のコマンドラインbowtieにはSTDINを使ってインデックスを提供することはできません。これはファイルでなければなりません。だから間違いなくSTDINからではなく、通常の引数である必要があります。

これは私が正常に(何のSTDINを使用していないファイルとして、入力ファイルとインデックスの両方を持つ、)スクリプトから蝶ネクタイを呼び出す方法です:full_options'-f -m1 -v1 --best --tryhard -S --sam-nosq'indexnameのようなものである

subprocess.call(["bowtie %s %s %s %s"(full_options,indexname,infile,outfile)], 
       shell=True) 

'Chlre4nm_cassette_new_m'のようなものです(シェル環境変数$BOWTIE_INDEXESによって与えられたディレクトリ内の、Chlre4nm_cassette_new_m。*。ebwtという形式の索引ファイル名の基本名です。これはbowtieが索引ファイルを検出する方法です)。

私は恐らくsubprocess.callを使いこなしていることに気付き、他の答えのようなリストにコマンド/オプション/引数を分割する必要があります。これは古いコードですが動作します。

+0

あなたは "bowtie%s ..."をリストに入れる必要はないと私が信じている方法です。私はsubprocess.callが文字列を受け入れると思います。文字列をリストに分割する利点は、シェルの依存関係を取り除くことができ、より効率的で、悪意のあるユーザーからの攻撃を受けにくくなることです。あなたの使用のためのスクリプトが(そしてあなたが悪意のあるではない)、パフォーマンスが問題でないなら、あなたの持っているものは私の意見では完全に受け入れられます... – mgilson

+0

@mgilson - ありがとう、ありがとう!私はこの作品(私は実際に使用しているコードです)を知っていますが、それをリストに分割する理由があるかどうかはわかりませんでした。 1つの質問:「シェルへの依存を取り除く」とはどういう意味ですか?私はそれが$ BOWTIE_INDEXESシェル変数に依存してインデックスファイルを見つけるので、bowtieのためにそれを行うことが可能であるかどうかわからないので頼んでいます - シェル= Falseを設定してもまだ動作しますか? – weronika

+0

私はサブプロセスが実際にはコマンドを実行するために新しいシェル(/ bin/sh)を生成するという印象を受けていましたが、ドキュメントは実際にこの時点であいまいです...しかし、それは新しいシェル...いずれにしても、シェル変数が環境に設定されている場合は、pythonとpythonが作成するサブプロセスによって継承される必要があります(envキーワードを使用しない限り...)。http://docs.python .org/library/subprocess.html#popen-constructor – mgilson

関連する問題