2012-07-20 15 views
11

Ho uno script Groovy che ricorre attraverso una directory alla ricerca di file .png e richiama pngquant (un'utilità della riga di comando) su ciascuno di. L'output di pngquant dovrebbe essere stampato sul terminale. Il codice di riferimento è:output processo di acquisizione in Groovy

def command = "pngquant -f -ext .png" 

root.eachFileRecurse(groovy.io.FileType.FILES) {File file -> 

    if (file.name.endsWith('.png')) { 
     println "Compressing file: $file" 

     def imgCommand = "$command $file.absolutePath" 

     Process pngquantCmd = imgCommand.execute() 
     pngquantCmd.consumeProcessOutput(System.out, System.err)   
    } 
} 

Lo script funziona bene, ma una volta che tutti i file sono stati elaborati, sembra che stout è ancora in fase reindirizzato, perché il prompt dei comandi non appare mai a meno che io uccido il processo con Ctrl + C. Ho bisogno di qualche modo "annullare"

pngquantCmd.consumeProcessOutput(System.out, System.err)   

o c'è un modo migliore per reindirizzare l'output di questo processo per la console? Credo che potrei risolvere questo problema semplicemente aggiungendo System.exit(0), ma questa non sembra la soluzione giusta. Il problema si verifica solo su Linux.

+0

Does 'waitForProcessOutput (System.out, System.err)' funziona meglio? –

+0

@tim_yates sì, funziona molto meglio, grazie mille! Se lo pubblichi come risposta, lo accetterò –

risposta

19

Invece di

pngquantCmd.consumeProcessOutput(System.out, System.err)   

che prenderà il via un paio di thread per leggere le uscite e aratro a prescindere dal processo di situazione, si dovrebbe provare

pngquantCmd.waitForProcessOutput(System.out, System.err) 

Quale sarà reindirizzare l'output di processo e poi aspettare che finisca prima di passare :-)

0

si può anche fare

Process pngquantCmd = imgCommand.execute(); 
def output= pngquantCmd .in.text; 
println("Output : " + output); 
Problemi correlati