Итак, "command".execute()
- правильный старт.
Но эта команда только запускает поток, и вы не ждете результата.
попробуйте этот код:
def task = "python main.py".execute()
task.waitFor()
println task.text
Эти строки запускают выполнение, ждут его завершения и выводят результат.
Чтобы выводить уже во время выполнения для более длительных задач, я написал себе небольшой помощник:
String.metaClass.executeCmd = { silent ->
//make sure that all paramters are interpreted through the cmd-shell
//TODO: make this also work with *nix
def p = "cmd /c ${delegate.value}".execute()
def result = [std: '', err: '']
def ready = false
Thread.start {
def reader = new BufferedReader(new InputStreamReader(p.in))
def line = ""
while ((line = reader.readLine()) != null) {
if (silent != false) {
println "" + line
}
result.std += line + "\n"
}
ready = true
reader.close()
}
p.waitForOrKill(30000)
def error = p.err.text
if (error.isEmpty()) {
return result
} else {
throw new RuntimeException("\n" + error)
}
}
Это определяет через метапрограммирование новый метод String
, называемый executeCmd
.
Поместите это в верхнюю часть вашего файла, а затем в свою строку
"python c:/main.py".executeCmd()
Это должно показать вам все выходные данные во время выполнения , и это поможет вам правильно обработать параметры с помощью префикса "cmd /c"
. (Если вы просто вызываете execute для строки, вы часто сталкиваетесь с проблемами с пробелами и другими символами в вашей команде.
Если у вас уже есть параметры в виде списка и вам нужен код, который также работает на * nix-машине, попробуйте вызвать execute()
в списке:
["python", "c:/main.py"].execute()
надеюсь, это поможет
пс: http://mrhaki.blogspot.com/2009/10/groovy-goodness-executing-string-or.html