2016-07-29 7 views
0

Ich habe ein Python-Skript, das eine Ressource in meinem Projekt ist. Zusammen mit dem Skript ist eine XML-Datei, die das Skript benötigt, um ordnungsgemäß ausgeführt werden. Ich bin in beiden Dateien als Input zu lesen und dann temporäre Dateien für beide erstellen:Wie führe ich ein Skript als Datei in Java aus?

InputStream is = (this.getClass().getClassLoader().getResourceAsStream("InterWebApp.py")); 
File script = File.createTempFile("script", ".py"); 
Files.copy(is, script.toPath(), StandardCopyOption.REPLACE_EXISTING); 
InputStream is1 = (this.getClass().getClassLoader().getResourceAsStream("setup.xml")); 
File xml = File.createTempFile("config", ".xml"); 
Files.copy(is1, xml.toPath(), StandardCopyOption.REPLACE_EXISTING); 

Aber ich bin nicht sicher, wie das Skript als einen Prozess zu starten:

Process p = Runtime.getRuntime().exec("." + script.getAbsolutePath()); 
p.waitFor(); 

Der obige Code führt eine IOException. Wie führe ich script.py aus und stelle sicher, dass es Zugriff auf config.xml hat? Im Moment analysiert das Python-Skript die XML-Datei nur mit dem absoluten Pfad, aber dieser Pfad wäre für die temporäre Datei nicht derselbe.

+0

Ich bin sehr rostig auf Java und weiß wenig von der 'File' Klasse, aber das sieht mir suspekt aus:' "." + script.getAbsolutePath() '. Scheint, dass Sie './ '' oder '". \ "' Abhängig von Ihrer Umgebung wünschen, und Sie möchten den grundlegenden Dateinamen, nicht den absoluten Pfad. –

+0

@JuanTomas Ich versuchte '" ./ "+ script.getName()', aber eine Ausnahme wurde ausgelöst, weil der Prozess die Datei – SVN600

+0

nicht finden konnte Könnten Sie bitte die Ausnahme bereitstellen? –

Antwort

1

Im Grunde fragen Sie sich selbst nach Problemen, da Sie nach dem absoluten Pfad fragen, aber setzen Sie ihn mit "." Voran, was im Allgemeinen ein relativer Pfad Modifikator ist. Versuchen Sie .exec(script.getAbsolutePath()) für Anfänger. Je nach Betriebssystem und/oder Konfiguration werden .py Dateien möglicherweise auch als ausführbar erkannt (z. B. werden auf Unix-Systemen nur Dateien mit einem ausführbaren Flag als ausführbar erkannt). Sie möchten möglicherweise den Speicherort der ausführbaren Python-Datei suchen und das Skript als Parameter übergeben.

+0

Ich benutze Linux und wenn ich deinen Vorschlag für den '.getAbsolutePath' versuche, erhalte ich einen Fehler, der von der Berechtigung verweigert wurde. Gibt es eine Problemumgehung für dieses Problem? Mir wurde gesagt, dass das Ausführen der tatsächlichen Ressourcendatei, die in der JAR verpackt ist, grundsätzlich unmöglich ist. – SVN600

+0

Sie müssen Dateiberechtigungen zwischen dem Schreiben der Datei und dem Versuch, sie auszuführen, setzen. –

+0

Ich setze die Erlaubnis zur Ausführung mit '.exec (" chmod 777 "+ script.getAbsolutePath())' aber ich bekomme eine Ausnahme der Berechtigung verweigert beim ersten Aufruf der Methode, aber beim zweiten Mal startet sie den Prozess erfolgreich aber die Dienst wird nicht ausgeführt – SVN600

Verwandte Themen