我需要在Jenkins的一个从属脚本控制台上运行像python -c "print('hello')"
那样简单的任意操作。这是我正在尝试的:
def cmd = 'python -c "print(\'hello\')"'
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "out> $sout\nerr> $serr"
然而,获得空输出:
out>
err>
有没有办法在Groovy中获取python的输出?
答案 0 :(得分:4)
尝试将命令分成数组
def cmdArray = ["python", "-c", "print('hello')"]
def cmd = cmdArray.execute()
cmd.waitForOrKill(1000)
println cmd.text
不确定为什么你的版本不起作用。
答案 1 :(得分:3)
这对我来说很完美:
def cmd = 'python -c "print(\'hello\')"'
def proc = cmd.execute()
proc.waitFor()
println "return code: ${ proc.exitValue()}"
println "stderr: ${proc.err.text}"
println "stdout: ${proc.in.text}"
使用"执行Groovy脚本" (不是"执行系统groovy脚本")
答案 2 :(得分:1)
要在上面提供的答案中添加一个更重要的信息,就是考虑为 python cmd或执行脚本的脚本stdout
和stderr
。
Groovy 添加了execute
方法以使执行Shell变得相当容易,例如,例如: python -c
cmd:
groovy:000> "python -c print('hello_world')".execute()
===> java.lang.UNIXProcess@2f62ea70
但是,如果您想获得与cmd 标准输出(String
)相关的stdout
和/或标准错误({ {1}}),那么使用上面引用的代码将没有结果输出。
因此,为了获得Groovy exec进程的 cmd输出,请始终尝试使用:
stderr
而不是
String bashCmd = "python -c print('hello_world')"
def proc = bashCmd.execute()
def cmdOtputStream = new StringBuffer()
proc.waitForProcessOutput(cmdOtputStream, System.err)
print cmdOtputStream.toString()
通过这种方式,我们在Groovy中执行命令后捕获了输出,因为后者是阻塞调用(check ref for reason)。
def cmdOtputStream = proc.in.text
print cmdOtputStream.toString()
函数的完整示例executeBashCommand
输出
String bashCmd1 = "python -c print('hello_world')"
println "bashCmd1: ${bashCmd1}"
String bashCmdStdOut = executeBashCommand(bashCmd1)
print "[DEBUG] cmd output: ${bashCmdStdOut}\n"
String bashCmd2 = "sh aws_route53_tests_int.sh"
println "bashCmd2: ${bashCmd2}"
bashCmdStdOut = executeBashCommand(bashCmd2)
print "[DEBUG] cmd output: ${bashCmdStdOut}\n"
def static executeBashCommand(shCmd){
def proc = shCmd.execute()
def outputStream = new StringBuffer()
proc.waitForProcessOutput(outputStream, System.err)
return outputStream.toString().trim()
}
注意1::如上面的代码(bashCmd1: python -c print('hello_world')
[DEBUG] cmd output: hello_world
bashCmd2: sh aws_route53_tests_int.sh
[DEBUG] cmd output: hello world script
)中所示,对于更复杂的python脚本,您应通过bashCmd2
bash shell脚本执行它。
注意2:所有示例均已在
下进行了测试.sh