2017-06-13 5 views
0

私はsnpSiftと呼ばれるJavaツールを実行しています。そのような私はpythongスクリプトを使用して、サブプロセスを使用しています。複数の文字列を一緒に付加して印刷すると、二重引用符があるところで '/'文字がスローされます

java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf 

このコマンドは、コマンドラインで直接使用したのと同じですが、実際にコマンドを使用しています。私は、variypという名前のリストを作成しました。このリストには、snpSiftを実行するときに変数として使用する異なるバリアントの文字列が含まれています。

コマンドライン入力全体を各ファイルと各variantTypeの文字列として含む別のリスト(コマンド)を作成しようとしています。私のスクリプトは以下の通りです:

command = [] 
for file in os.listdir("filepath"): 
    absfile = os.path.abspath(file) 
    if(file.endswith(".vcf")): 
     for i in variantType: 
      w = 'java -jar SnpSift.jar filter "' 
      x = "ANN[0].EFFECT has " 
      y = "'" + i + "'" 
      z = '" ' + absfile + " > output." + i + "." + str(file) 
      command.append(w+x+y+z) 

私の問題は、フィルタの入力は、このように引用符を有していなければならないことである:二重引用符を使用してこれを行うには"ANN[0].EFFECT has 'variant'"

私の試みは失敗した、との結果きました次の出力:

'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'transcript_ablation\'" input.vcf > ~output.vcf' 

これらの '\'文字を削除するにはどうすればよいですか? y(文字列全体のその部分を含む変数)を印刷すると、これらの文字は印刷されませんが、コマンド全体を印刷すると、それらが存在するため、コマンドを正しく実行できません。

EDIT

私が使用:

print(command[0]) 

これは( '\' なし)希望コマンドを出力します。

私が使用した場合にのみこれは、次のとおりです。

command[0] 

問題が発生しています。

答えて

0

まだコメントすることはできませんが、おそらくこの回答が役立ちます。

文字に直接アクセスすることで、文字列内の特定の位置にある文字を確認できます(somestr[position])。私はあなたが(少しコマンドを作成するためのフォーマットを使用して例えば、修正された)例をコーディング実行し、テストした48位でありどの文字と、それが実際にASCIIコード39と単一引用符であることが判明:

import os 

variantType = ['variant', 'test'] 

command = [] 

absfile = "/tmp.vcf" 
file = "tmp.vcp" 

for i in variantType: 
    w = 'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'{v}\'" input.vcf > ~/output.vcf'.format(v=i) 

    command.append(w) 

print(", ".join([str(x) for x in command])) 

for x in command: 
    print(repr(x)) 
    print(str(x)) 
    print(ord(x[48])) 

あなたが見ることができるように

['java -jar SnpSift.jar filter "ANN[0].EFFECT has \'variant\'" input.vcf > ~/output.vcf', 'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'test\'" input.vcf > ~/output.vcf'] 
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf, java -jar SnpSift.jar filter "ANN[0].EFFECT has 'test'" input.vcf > ~/output.vcf 
'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'variant\'" input.vcf > ~/output.vcf' 
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'variant'" input.vcf > ~/output.vcf 
' 
39 
'java -jar SnpSift.jar filter "ANN[0].EFFECT has \'test\'" input.vcf > ~/output.vcf' 
java -jar SnpSift.jar filter "ANN[0].EFFECT has 'test'" input.vcf > ~/output.vcf 
' 
39 

は、各コマンドのために、最初のprint文は、(オブジェクトの__repr__機能を使用して)、「不正な形式」の文字列表現を作成し、第二のバージョンはきれいに整形さ1を生成します。出力は、以下の通りです。 (オブジェクトの__str__関数を使用して)。あなたがprint(somelist)を呼び出したときに何が起こっている

はPythonがeval機能を使用して印刷されたリスト文字列からリストを再作成することができます可能性がsomelist内の各オブジェクトのrepr値を、出力していることです。

__repr__()__str()__の違いの詳細については、以下のリンクをチェックしてください:ご返信用

+0

感謝を。ステートメントを印刷するときに推奨することはありますが、 'for i in command: subprocess.call(i)'を使用してサブプロセスを実行する場合は、/と同じ問題が発生します。 – spiral01

+0

私の例を 'w = '/ bin/echo" \' {v} \ '"'。format(v = i)'に置き換えてみることができます。次に、forループ 'print(subprocess.call(x、shell = True))'でこのコマンドを起動しようとします(そうでなければ、サブプロセスは_x_を異なって解釈します。 _echo_は '' test''です。それはあなたのために働くのですか?エラーメッセージは何ですか? – mjoppich

関連する問題