Py学习  »  Python

如何使用grovy脚本控制台(jenkins)中的bash向python发送单个管道命令?

Alexander Stohr • 4 年前 • 132 次点击  

我使用的是Jenkins提供的groovy脚本控制台。 我有一个很好的工作线为詹金斯奴隶(基于Windows):

println "cmd /c echo print(\"this is a sample text.\") | python".execute().text

现在我想要一个Jenkins slave(基于Linux)的功能等价物。 所以我从Linux命令行开始,让这个核心命令为我工作:

bash -c 'echo print\(\"this is a sample text.\"\) | python'

然后,我将所有这些控制台命令行封装到一个更多的转义代码和调用修饰中——但是通过这个,它进入了一个不再正常工作的状态:

println "bash -c \'echo print\\(\\\"this is a sample text.\\\"\\) | python\'".execute().txt

运行时的结果如下:

空的

我觉得我现在被困在了,因为我没能解决影响逃逸角色等级的众多问题。 怎么了?如何解决?(也许:为什么?)

附言:如果不清楚的话-我想(如果可能的话)像最初的物品一样贴在一个衬垫上。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38637
 
132 次点击  
文章 [ 3 ]  |  最新文章 4 年前
Alexander Stohr
Reply   •   1 楼
Alexander Stohr    4 年前

在深入研究之后,我发现了一个与平台无关、支持错误通道(stderr)和执行故障的解决方案,它甚至可以避免操作系统特定的组件,如bash/cmd.exe:

try {
  def command = ['python', '-c', /print("this is a sample text.")/];
  if (System.properties['os.name'].toLowerCase().contains('windows'))
  {
    command[2] = command[2].replaceAll(/\"/, /\\\"/)
  }
  println "command=" + command
  def proc = command.execute()
  def rc = proc.waitFor()
  println "rc=" + rc

  def err = proc.err.text
  if( err != "" ) { print "stderr=" + err }

  def out = proc.text
  if( out != "" ) { print "stdout=" + out }
} catch(Exception e) {
  println "exception=" + e
}
println ""
Anubis
Reply   •   2 楼
Anubis    4 年前
print "bash -c 'echo \"print(\\\"this is a sample text.\\\")\" | python'"

输出:

bash -c 'echo "print(\"this is a sample text.\")" | python'
thehole
Reply   •   3 楼
thehole    4 年前

如果你不需要用管道把bash导入python,也许这适合你的喜好?

['python','-c','print("this is a sample text")'].execute().text

如果你 需要它,试试看

['bash','-c', /echo print\(\"this is a sample text.\"\) | python/].execute().text

使用 List .execute() 有助于澄清每个论点是什么。斜杠字符串通过更改转义符来帮助实现。