2016-09-26 10 views
0

モジュールのファイル名と引数をcall()モジュールを使用して渡す基本関数を作成しようとしています。ファイル名と引数は変数です。 call()を使用すると、変数が必要になりますが、呼び出されるプログラムは、"を含む文字列を読み込みます。ここで Python 2.7.xでサブプロセスによって呼び出されたコマンドの引数として変数を使用

は、問題のコードです:

from subprocess import call 

def mednafen(): 
    print "Loading "+romname+"..." 
     call(["mednafen", args, romname]) 
     print "Mednafen closed." 
romname="kirby.zip" 
args="-fs 1" 
mednafen() 

私はこれが

mednafen -fs 1 kirby.zip 

を実行すると期待されるが、代わりに、このように、可変の文字列を解釈するために表示されます。

mednafen "-fs 1" "kirby.zip" 

のため、これは、で始まる引数を解析できないため、mednafenを実行できません。。 shell=Trueを使用すると期待どおりに機能しますが、その機能は悪用されやすいので強く推奨されません。

call("mednafen "+ args +" "+romname+"; exit", shell=True) 

shell=True形式を使用せずにこれを行う方法はありますか?

+1

argsをstr(args)に置き換えてみてください – XZ6H

+0

ありがとう、私はそれを行ったが、何の効果もなかったようだ。 call()は引き続き引用符付きの変数を解釈しています。 –

+0

あなたのコードは実際にパラメータを渡すわけではありませんが、私たちはあなたが意味するものを推測できます。 – tripleee

答えて

1

EDITJonas Wielickiによって提案されたソリューションは、通常、個別の項目として表示されているシェル構文にスペースで区切られます確認してくださいすべての単一の文字列を作ることです。そうすれば、call()は正しく読み取られます。 shlexは不要です。

args = ["-fs", "1"] 
call(['mednafen']+args+[rom]) 

私の最初の(少ない簡潔な)解決策: shlex.split()は、私はそれを養う変数/文字列を受け取り、順番にではなく、それらを正しく解析するというコマンドが発生する文字列リテラルのリスト、に変換し変数を引用符で囲んだ文字列として解釈します。 したがって、引数が"-fs 0"のように扱われているのではなく、当初のように-fs 0を取得しています。

import shlex 
call(shlex.split("mednafen "+args+" "+romname)) 
+0

この場合、shlex.splitは機能しますが、引数を適切なリスト( '' ["-fs"、 "1"] '')としてすぐに使用できる場合は、shlex.splitこれは驚き(引用符などの扱い)になるかもしれない多くの機能を持っています。サブプロセスを使用すると、Pythonはスペースのすべての落とし穴を避け、単純にPythonの文字列*を正しく引数に渡すことで引用する素晴らしいツールを提供します。その力を使う。 –

+0

これは非常に役に立ちます!どうもありがとう。これは、サブプロセスが私のためにプログラム/引数をどのように扱うかを実際にクリアします。 –

1

まあ、はい。それはまさにドキュメンテーションが言っていることです。代わりに、コマンドとすべての引数を含むリストを作成して渡します。

+0

実際には 'args'をリストにして' call(['mednafen'] + args + [romname]) ' – tripleee

+0

と同じ結果になります。 'call()'は引用符を含めて 'args'の内容を解析しています。 –

+0

これは、すべての引数を持つ文字列ではなく、各引数を持つリストに変換するのを忘れたからです。 –

関連する問題