2010-10-29 30 views
5

Ho questa applicazione java e ho incontrato un requisito per analizzare uno STDF.Come eseguire uno script python da java?

In realtà tutto ciò di cui avevo bisogno è ottenere le sezioni FAR, MIR e MRR di un file stdf. Esiste uno stdf4j su sourceforge ma non posso usarlo molto a causa della mancanza di documentazione.

La soluzione era utilizzare lo stdfparser che è scritto in python ed è relativamente più semplice e rende il lavoro più facile, che in effetti ho già modificato per soddisfare le mie esigenze.

Così ora ho solo bisogno di invocare questo script in modo verbale e leggere il file risultante in Java e andare avanti con l'applicazione esistente.

Il problema è che quando si utilizza:

Process p = r.exec("cmd /c python parser.py sample_data.std.gz -v test.txt"); 

il file di testo risultante è sempre vuota. (Si noti che l'ho già eseguito sulla riga di comando effettiva e ho recuperato con successo i contenuti necessari.)

C'è qualcosa che mi manca, o ci sono alternative migliori. (Sto cercando di evitare jython perché non riesco a installarlo nell'ambiente di produzione.)

+0

in ambiente Windows, il percorso dell'eseguibile deve essere esplicitamente dichiarato tale che: Processo p = r.exec ("C: /WINDOWS/system32/cmd.exe/c python parser.py sample_data.std.gz> test .testo"); – lock

risposta

6

Dovresti forse chiamare p.waitFor(); in modo che il tuo programma Java non si muova fino a quando il processo esterno non ha completato l'esecuzione.

Aggiornamento 1: Assicurarsi inoltre di leggere tutti i byte su p.getErrorStream() e p.getInputStream(). In caso contrario, potrebbe bloccarsi.

Aggiornamento 2: è inoltre possibile controllare il codice di ritorno del processo per un codice di errore. Si accede al codice di ritorno del processo tramite il valore di ritorno di waitFor().

+0

in realtà la riga successiva dopo quel codice, io non l'ho inclusa per evitare confusione, ma suppongo che abbia fatto diversamente: P – lock

+1

OK, successivamente assicurati di svuotare tutti i byte da p.getErrorStream() e p.getInputStream(). Inoltre, è possibile che usare "cmd/c python" invece di eseguire direttamente "python", possa causare un problema? –

0

Provare a creare un file cmd e quindi chiamarlo utilizzando Java.

+0

Ci sono modi migliori per farlo. Fai riferimento alla risposta di Mike Clark ~ _ ~ – rana

2

Oltre a essere sicuri di chiamare p.waitFor(), potrebbe essere necessario leggere il contenuto degli stream. Se i flussi non vengono letti, i processi si bloccano.

Prova ad aggiungere questa classe: http://www.physionet.org/physiotools/puka/sourceCode/puka/StreamGobbler.java

e chiamandolo:

new StreamGobbler(p.getErrorStream(), "Error"); 
new StreamGobbler(p.getInputStream(), "Input"); 

potrebbe essere in grado di venire con una classe più efficiente da soli, ma che si dovrebbe almeno dare la idea di base (nota che non è stata scritta da me).

Problemi correlati