我有一个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:有时会以某种方式打印乱码:
答案 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")))