2016-05-23 9 views
0

PythonからGradle JavaExecタスクを呼び出す際にクロスプラットフォームの問題が発生しています。 1つのサブプロジェクトには出力を生成するためのアプリケーションがあり、コマンドライン引数を受け入れます。Python/Gradleでエスケープ文字に関連するクロスプラットフォームの問題

のGradleのタスク:コマンドラインで

task run(type: JavaExec) { 
    main = 'generator.myGenerator' 
    classpath = sourceSets.main.runtimeClasspath 
    if (System.getProperty("exec.args") != null) { 
     args System.getProperty("exec.args").split() 
    } 
} 

が、これは、例えば次のように入力して実行されます。

./gradlew run -Dexec.args="--minBound 5 --maxBound 8" 

別のサブプロジェクトが適切なディレクトリとなりに、この発電機や手順を実行したいですサブプロセスコール:関連するパラメータを渡す:

Pythonコード:

args = ('-Dexec.args=\"--minBound\ ' + str(min_bound) + 
        '\ --maxBound\ ' + str(max_bound) + '\"') 


subprocess.check_call(['./gradlew', 'run', args]) 

これはCygwinではうまく動作しますが、Ubuntu 16.04 LTSではうまく動作しません。 エラーメッセージがある:

:generator:run 
maxBound\ is not a recognized option 

このエラーメッセージは、発電機のコマンドラインパーサによって生成されます。この問題は、Cygwinがスペースを逃れるために必要なバックスラッシュが問題を引き起こすことは明らかです。エスケープを削除しても、Linux上で問題が解決されるとは思われません。何が必要なのか分かりません。

私はPython 3.5を使用しています。

これはLinux対Windowsのエスケープの問題であるか、それがGradleの問題であるか、Pythonと関係があるかどうかはわかりません。どんな助けでも大歓迎です。

答えて

0

いくつかの工夫の後、私は、リスト内のすべての引数を入れて

args = '\ '.join(argList) 

で文字列にそれらを回すことにより、Cygwinのに働くだろうと

args = ' '.join(argList) 

は、Linux上で動作することを気づきました。 しかし、どのOSが使用されているかを検出することなく、このソリューションにはプラットフォームに依存しない優れた方法が見つかりませんでした。代わりに、私はCygwinとLinuxの両方でうまく動作する生の文字列に基づいた解決策を見つけました。

argRaw = r"-Dexec.args= --minBound {} --maxBound {}" 
args = argRaw.format(min_bound, max_bound) 
関連する問題