2014-09-22 39 views
4

我有一個Python腳本,它打印一些字符串和更新,它在控制檯執行進度:搖籃Exec的任務和過程輸出

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一切正常,我可以看到輸出和進度條。我需要運行該腳本搖籃建設的一部分,所以,我創建了一個任務:

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

回答

6

我工作圍繞這個問題由蟒蛇沖洗系統輸出腳本。這不是理想的解決方案,但它可以完成工作。

所以我有以下我的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) 
+0

你是男人! – madhead 2015-01-28 14:56:53

1

對我來說,唯一的解決辦法是將輸出重定向到文件:

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