簡體   English   中英

與使用Python / Gradle轉義字符有關的跨平台問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM