1

次のコード行を実行しようとしています。

subprocess.call(["java", "-cp", "/home/me/somepath/file.jar", ..., "-someflag somevalue"])

コードが失敗し、実行しようとしているjarから使用情報が表示されます。しかし、文字列を展開してターミナルに貼り付けると、機能します(shモジュールがエラーになったときに文字列を吐き返すので、文字列を正しく展開していることがわかります)。したがって、これはサブプロセスまたはshの動作方法に関する問題です。

使用方法の例を次に示します。

subprocess.call(["ls", "-l"])

説明は次のとおりです。

subprocess.check_call(args, *, stdin=None, stdout=None, stderr=None, shell=False)

argsはすべての呼び出しに必要であり、文字列または一連のプログラム引数である必要があります。引数のシーケンスを提供することは、モジュールが引数の必要なエスケープと引用符を処理できるようにするため(たとえば、ファイル名にスペースを許可するため)、一般的に好まれます。単一の文字列を渡す場合は、シェルがTrue(以下を参照)であるか、引数を指定せずに文字列が実行されるプログラムに名前を付けるだけである必要があります。

http://docs.python.org/2/library/subprocess.html

リスト内の文字列をフラグと値で別々の場所に分割する必要があるかどうかはわかりません。

4

2 に答える 2

3
subprocess.call(["java", "-cp", "/home/me/somepath/file.jar", ..., "-someflag", "somevalue"])

元のコードはに対応しています

java -cp /home/me/somepath/file.jar ... "-someflag somevalue"

シェルで。

于 2012-11-29T03:18:43.563 に答える
0

shellフラグをtrueに切り替えます

すなわち、

subprocess.check_call(["java", "-cp", cp_arg, ..., "-someflag somevalue"], shell=True)

また、ヒントとして、このsplit()関数を使用して文字列コマンドを分割できます。

subprocess.check_call("java -cp blah blah".split(), shell=True)

于 2012-11-29T03:14:56.460 に答える