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