2017-11-11 4 views
1

私は毎回わずかに異なるパラメータでシミュレーションを実行しなければならない作業があります。私はこれを自動化するPythonスクリプトを書いてみたいが、問題がある。Python:コマンドライン命令を書くときの文字列フォーマット

説明を簡単にするために、私は基本的にコマンドラインから呼び出されたNのシミュレーションを用意しています。それぞれのパラメータのセットが異なります。スクリプトを1つずつ実行したいと思います。シミュレーションを実行すると、...が与えられたシミュレーションのパラメータであることを表すコマンドラインにexecute_simulation...と書いているとします。これは私のスクリプトのようです:

from subprocess import call 

<code> 

for i in range(0, N): 
    call('execute_simulation_%s' % (parameters[i])) 

しかし、私はいつもスクリプトを呼び出すときにエラーメッセージが表示されます。なぜこれが事実かもしれないか誰も提案できますか?

+2

エラーメッセージは何ですか? ['call'](https://docs.python.org/2.7/library/subprocess.html#subprocess.call)は、文字列ではなくargsのリストを期待しています(' shell = True'を使用しない限り)。避ける)。 –

+1

エラーメッセージは何ですか? –

+0

シミュレーションファイルは何ですか?あなたの 'parameters []'はファイル拡張子も含んでいますか? 'call( 'ca%s.exe'%lc ')'は私のために働いています(Win7)。 – bastelflp

答えて

0

エラーメッセージが含まれていれば助けになりますが、とにかくお手伝いします。

関数call関数は、文字列が単一の文字列ではないことを期待しています(ただし、PopenにはWindowsで文字列に変換されていると記載されています)。

また、指定したコード例では、call('execute_simulation_%s' % (parameters[i]))でした。 parameters[i]が文字列ではなくリストである場合、タプル、ジェネレータ、またはstrがそのオブジェクトで呼び出されます。つまり、execute_simulation ['arg0', 'arg1', 'arg2', 'arg3', 'arg4']のようなものが得られます。これはおそらくあなたが望むものではありません。シーケンス上で' '.joinと呼ぶと、execute_simulation arg0 arg1 arg2 arg3 arg4のようなものが得られます。

これで、私はparametersの各呼び出しの引数を含むリストを前提としています。そして、あなたは(それだけでcallように動作します)Pythonで3.5+コードを使用することを推奨しているので

args = [f'arg{i}' for i in range(5)] 
parameters = [args for i in range(5)] 

for args in parameters: 
    call(('execute_simulation', *args)) 

はまた、subprocess.runを使用することを検討して行うことができます。 私はあなたのケースでこれがうまくいくことを願っています。

関連する問題