2010-10-29 42 views
5

Tengo esta aplicación java y me encontré con el requisito de analizar un STDF.¿Cómo ejecutar un script python desde java?

En realidad, todo lo que necesitaba era obtener las secciones FAR, MIR y MRR de un archivo stdf. Existe un stdf4j en sourceforge pero no puedo usarlo tanto debido a la falta de documentación.

La resolución fue utilizar el stdfparser que está escrito en python y es relativamente más sencillo y hace el trabajo más fácil, que de hecho ya he modificado para satisfacer mis necesidades.

Así que ahora solo necesito invocar este script en detalle y leer el archivo resultante en Java y continuar con la aplicación existente.

El problema es que cuando se utiliza:

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

el archivo de texto resultante es siempre blanco. (Tenga en cuenta que ya ejecuté esto en la línea de comando real y recuperé con éxito el contenido que necesitaba.)

¿Hay algo que me esté perdiendo, o hay mejores alternativas? (Estoy tratando de evitar jython ya que no puedo instalar su jar en el entorno de producción).

+0

en el entorno de Windows, la ruta al ejecutable debe declararse explícitamente de tal manera que: Proceso p = r.exec ("C: /WINDOWS/system32/cmd.exe/c python parser.py sample_data.std.gz> test .TXT"); – lock

Respuesta

6

Quizás deba llamar al p.waitFor(); para que su programa Java no se mueva hasta después de que el proceso externo haya terminado de ejecutarse.

Actualización 1: También asegúrese de leer todos los bytes de p.getErrorStream() y p.getInputStream(). De lo contrario, puede suspender el proceso.

Actualización 2: Es posible que también desee comprobar el código de retorno del proceso para un código de error. Se accede al código de retorno del proceso a través del valor de retorno de waitFor().

+0

es en realidad la siguiente línea después de ese código, simplemente no lo incluí para evitar confusiones, pero supongo que sí lo hizo: P – lock

+1

OK, luego asegúrese de que está drenando todos los bytes p.getErrorStream() y p.getInputStream(). Además, ¿es posible que usar "cmd/c python" en lugar de simplemente ejecutar "python" directamente, pueda causar un problema? –

0

Intente crear un archivo cmd y luego invocarlo usando Java.

+0

Hay mejores formas de hacerlo. Consulte la respuesta de Mike Clark ~ _ ~ – rana

2

Además de asegurarse de llamar al p.waitFor(), es posible que también tenga que leer el contenido de las transmisiones. Si las secuencias no se leen, los procesos se detendrán.

Trate de añadir esta clase: http://www.physionet.org/physiotools/puka/sourceCode/puka/StreamGobbler.java

Y llamándolo:

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

que podría ser capaz de llegar a una clase más eficiente por su cuenta, sino que uno debe al menos le dará la idea básica (tenga en cuenta que no fue escrito por mí).

Cuestiones relacionadas