[英]Cross-platform issue related to escaping characters with Python / Gradle
從Python調用Gradle JavaExec任務時遇到跨平台問題。 一個子項目有一個應用程序來生成一些輸出,並且它接受命令行參數來這樣做。
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有關。 任何幫助將不勝感激。
經過一番修補后,我注意到通過將所有參數放入列表並將它們轉換為
args = '\ '.join(argList)
將在Cygwin上工作,
args = ' '.join(argList)
將在Linux上運行。 但是,在未檢測到正在使用哪個操作系統的情況下,我沒有找到一種適用於該解決方案的很好的平台無關方法。 相反,我發現了一種基於原始字符串的解決方案,該解決方案在Cygwin和Linux上均能很好地工作。
argRaw = r"-Dexec.args= --minBound {} --maxBound {}"
args = argRaw.format(min_bound, max_bound)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.