2010-10-29 5 views
5

J'ai cette application Java et j'ai eu besoin d'analyser un fichier STDF.Comment lancer un script python à partir de Java?

En fait, tout ce dont j'avais besoin est d'obtenir les sections FAR, MIR et MRR d'un fichier stdf. Il existe un stdf4j sur sourceforge mais je ne peux pas l'utiliser autant en raison du manque de documentation. La résolution était d'utiliser le stdfparser qui est écrit en python et est relativement plus simple et facilite le travail, ce que j'ai déjà modifié pour répondre à mes besoins. Maintenant, j'ai juste besoin d'invoquer ce script verbalement et de lire le fichier résultant en Java et de passer à l'application existante.

problème est lorsque vous utilisez:

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

le fichier texte résultant est toujours vide. (Notez que j'ai déjà exécuté ceci sur la ligne de commande et que j'ai récupéré le contenu dont j'avais besoin.)

Y at-il quelque chose qui me manque ou existe-t-il de meilleures alternatives? (J'essaie d'éviter jython car je ne peux pas installer son jar sur l'environnement de production.)

+0

Dans l'environnement Windows, le chemin d'accès à l'exécutable doit être explicitement déclaré tel que: Processus p = r.exec ("C: /WINDOWS/system32/cmd.exe/c python parser.py sample_data.std.gz> test .SMS"); – lock

Répondre

6

Vous devriez peut-être appeler p.waitFor(); afin que votre programme Java ne se déplace qu'après l'exécution du processus externe. Mise à jour 1: Assurez-vous également de lire tous les octets parmi p.getErrorStream() et p.getInputStream(). Ne pas le faire peut bloquer le processus.

Mise à jour 2: Vous pouvez également vérifier le code de retour du processus pour un code d'erreur. Le code retour du processus est accessible via la valeur de retour waitFor().

+0

son réellement la ligne suivante après ce code, je ne l'ai pas inclus pour éviter la confusion, mais je suppose qu'il a fait autrement: P – lock

+1

OK, ensuite assurez-vous de drainer tous les octets de p.getErrorStream() et p.getInputStream(). Aussi, est-il possible que l'utilisation de "cmd/c python" au lieu de simplement lancer "python" directement, pourrait causer un problème? –

0

Essayez de créer un fichier cmd, puis appelez cela en utilisant Java.

+0

Il existe de meilleurs moyens de le faire. Reportez-vous à la réponse de Mike Clark ~ 0 ~ – rana

2

En plus de vous assurer que vous appelez p.waitFor(), vous devrez peut-être également lire le contenu des flux. Si les flux ne sont pas lus, les processus seront bloqués.

Essayez d'ajouter cette classe: http://www.physionet.org/physiotools/puka/sourceCode/puka/StreamGobbler.java

et de l'appeler:

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

Vous pourriez être en mesure de venir avec une classe plus efficace sur votre propre, mais que l'on devrait au moins vous donner la idée de base (notez que ce n'était pas écrit par moi).

Questions connexes