Python von Java (Tomcat6) als Subprozess aufrufen

Ich versuche, ein Python-Skript von einem Java / Tomcat6 Webapp zu nennen. Ich verwende derzeit den folgenden Code:

Process p = Runtime.getRuntime().exec("python <file.py>"); InputStream in = p.getInputStream(); InputStreamReader isr = new InputStreamReader(in); BufferedReader b = new BufferedReader(isr); logger.info("PYTHON OUTPUT"); String line = null; while ( (line = b.readLine()) != null){ logger.info(line); } p.waitFor(); logger.info("COMPLETE PYTHON OUTPUT"); logger.info("EXIT VALUE: "+p.exitValue()); 

Ich kann nicht sehen, jede Ausgabe in der catalinia.out Datei aus dem Python-Skript und mit einer Adapter-Bibliothek wie jython ist nicht möglich, da das Skript auf mehrere maschinelle Lernbibliotheken, die Python's Numpy-Modul zu arbeiten benötigt.

Hilfe?

One Solution collect form web for “Python von Java (Tomcat6) als Subprozess aufrufen”

Die Erklärung ist wahrscheinlich eine (oder mehrere) der folgenden:

  • Der Befehl ist fehlgeschlagen und schreibe Fehlermeldungen an seine "stderr" fd … die du nicht ansiehst.

  • Der Befehl wird nicht gestartet, da der Befehlsname falsch ist; ZB kann es nicht auf $PATH .

  • Der Befehl versucht, von seinem stdin fd zu lesen … aber du hast keine Eingabe (noch) zur Verfügung gestellt.

  • Es könnte ein Problem mit der Befehlszeilenspaltung sein; ZB wenn man Pfadnamen mit eingebetteten Räumen verwendet oder andere Dinge, die normalerweise von der Shell behandelt werden.

Auch da dies Python ist, könnte dies ein Problem mit python-spezifischen Umgebungsvariablen, dem aktuellen Verzeichnis und / oder dem effektiven Benutzer sein, der den Befehl ausführt.


Vorgehensweise:

  1. Bestimmen Sie, ob der Pythonbefehl tatsächlich beginnt. Zum Beispiel. "Hack" das "", um etwas zu einer temporären Datei beim Start zu schreiben.

  2. Ändern Sie mit ProcessBuilder , um das Process zu erstellen. Dies gibt Ihnen mehr Kontrolle über die Ströme und wie sie behandelt werden.

  3. Finden Sie heraus, was zu den Kindprozessen "stderr" geht. (ProcessBuilder erlaubt Ihnen, es auf "stdout" umzuleiten …)

Python ist die beste Programmiersprache der Welt.