Gradle Exec任务和进程输出

时间:2014-09-22 18:42:54

标签: python process gradle stdout build.gradle

我有一个python脚本,它打印一些字符串并在控制台中更新它的执行进度:

if __name__ == '__main__':
    ...

    print 'Hello, world!'

    while page <= pages:
        ...

        done = float(page) / pages
        sys.stdout.write('\r[{0:50s}] {1:.2f}%'.format('#' * int(done * 50), done * 100))

        page += 1

    print ''

当我从python script.py这样的控制台运行时,一切正常,我可以看到输出和进度条。我需要将此脚本作为Gradle构建的一部分运行,因此,我创建了一个任务:

task process(type: Exec) {
    workingDir file('src/main/python')
    commandLine 'python', 'process.py', ...
}

现在,当我使用gradle process执行脚本时,我在控制台中看不到输出,打印的最后一行是> Building 0% > :process

我试图使用Java 7的ProcessBuilder也没有运气:

task process << {
    def processBuilder = new ProcessBuilder([
            'python',
            'process.py',
            ...
    ]).directory(file('src/main/python'))
            .redirectInput(ProcessBuilder.Redirect.INHERIT)
            .redirectOutput(ProcessBuilder.Redirect.INHERIT)
            .redirectError(ProcessBuilder.Redirect.INHERIT).start().waitFor()
}

我被困住了。我真的想在同一个控制台中看到python的输出。我怎样才能实现它?

UPD:有时会以某种方式打印乱码:enter image description here

2 个答案:

答案 0 :(得分:7)

我通过在python脚本中刷新系统输出来解决这个问题。它不是理想的解决方案,但它可以完成工作。

所以我的python脚本中有以下内容

import sys
import time

def flush_out(string):
    print(string)
    sys.stdout.flush()

#script does something
flush_out("Waiting for 10 seconds...")
time.sleep(10)
flush_out("Exiting")
sys.exit(0)

答案 1 :(得分:2)

我唯一的解决方案是将输出重定向到文件:

  .redirectErrorStream(true)
  .redirectOutput(ProcessBuilder.Redirect.to(new File(project.buildDir, "my-task.log")))