Externes Programm steuern

Status
Nicht offen für weitere Antworten.

nemo86

Mitglied
Hallo,
hab folgendes Problem: unter Java muss ein Programm gestartet werden, das sich nur über bash Shell bedienen lässt. Danach muss ich ein paar Befehele, die das Programm steuren, aufrufen. Z.B. sollte folgende Codestück völlig automatisch ablaufen:

Code:
$ poly
> fun f () = print "Hello World\n";
> PolyML.export("hello", f);
> ^D
$ cc -o hello hello.o -lpolymain -lpolyml
$ ./hello
Hab mir überlegt, dass das am besten geht, wenn ich die Befehle unter Java an bash übergebe. Nun, das Programm selbs (poly) zu starten ist kein Problem, aber wie übergebe ich weitere Befehle? (Zb fun f () = print "Hello World\n"; )
 
Zuletzt bearbeitet von einem Moderator:

faetzminator

Gesperrter Benutzer
Entweder kannst du da direkt in den Channel schreiben oder die Bash bereits mit folgendem aufrufen (ungetestet):
Code:
$ poly | echo "fun f () = print \"Hello World\n\";\nPolyML.export(\"hello\", f);"
 

heart_disease

Bekanntes Mitglied
Verwende einfach den ProcessBuilder und hol dir dann den OutputStream um die Befehle an das Programm zu übergeben.
 

nemo86

Mitglied
und weiter? ich meine, unter Java kann ich höchstens poly startten also:

Process p=Runtime.getRuntime().exec("poly");

weitre Eingaben, (fun f()=...) kann ich irgendwie nicht weitergeben.
 

Ebenius

Top Contributor
weitre Eingaben, (fun f()=...) kann ich irgendwie nicht weitergeben.
Doch, doch. :)

Java:
/**
 * Test main method.
 * 
 * @param args ignored
 * @throws IOException
 * @throws InterruptedException
 */
public static void main(String[] args)
      throws IOException, InterruptedException {
  class StreamPipe implements Runnable {

    final InputStream input;
    final PrintStream output;

    StreamPipe(InputStream input, PrintStream output) {
      this.input = input;
      this.output = output;
    }

    public void run() {
      int b;
      try {
        while ((b = input.read()) != -1) {
          output.write(b);
        }
      } catch (IOException ex) {
        ex.printStackTrace();
      }
    }
  }

  final ProcessBuilder pb = new ProcessBuilder("poly");
  final Process process = pb.start();
  new Thread(new StreamPipe(process.getInputStream(), System.out)).start();
  new Thread(new StreamPipe(process.getErrorStream(), System.err)).start();

  final PrintStream stdin = new PrintStream(process.getOutputStream());
  stdin.println("fun f () = print \"Hello World\\n\";");
  stdin.println("...");
  stdin.flush();
  process.waitFor();
}
Ebenius
 

nemo86

Mitglied
Beim ausführend vom Code unter Linux meldet ads Programm folgendes:

Code:
<pfad>: error while loading shared libraries: <irgend ein bibloithek> cannot open shared object file: No such file or directory.

Die Datei ist aber im Verzeichnis vorhanden. Hat jemand eine Idee woran das liegen kann?
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Ferzeichnis liest sich foll valsch. :D

Shared Objects werden grundsätzlich gegen die Umgebungsvariable $LD_LIBRARY_PATH aufgelöst. Dort steht der Punkt (also das CWD) in aller Regel nicht drin. Also musst Du beim Aufruf das Environment mit passendem $LD_LIBRARY_PATH initialisieren.

... nehme ich an. :)

Ebenius
 

nemo86

Mitglied
Ups :oops: Korrigiert:)

Ich wäre sehr dankbar, wenn du das ein bisschen ausführlicher schreibst. Wie initialisiere ich das Environment und was ist CWD? )
 

Ebenius

Top Contributor
Wie initialisiere ich das Environment [...]
Die API-Doc verrät uns das: ProcessBuilder.environment().
Letztendlich holst Du aus dem Environment die Variable, hängst einen '.' als Pfadelement an und setzt die Variable wieder: [java=33]final Map<String, String> env = pb.environment();
String envLD_LIBRARY_PATH = env.get("LD_LIBRARY_PATH");
if (envLD_LIBRARY_PATH != null && !envLD_LIBRARY_PATH.equals("")) {
envLD_LIBRARY_PATH = envLD_LIBRARY_PATH + File.pathSeparator + '.';
} else {
envLD_LIBRARY_PATH = '.';
}
env.put("LD_LIBRARY_PATH", envLD_LIBRARY_PATH);[/code]

[...] und was ist CWD? )
Halt mal die Maus über das Wort. Moderne Browser zeigen Dir die Erklärung an (ist eine Abkürzung die "Current Working Directory" heißt).

Ebenius
 

nemo86

Mitglied
hm... irgendwie macht das nicht, was es machen soll. Es wird ja ledeglich ein Punkt am Ende des Strings hinzugefügt, wo Standartbibliotheken gespeichert sind, das Bibliothek vom Programm wird weiterhin nicht gefunden....
 

Ebenius

Top Contributor
Trag halt statt des Punktes mal den absoluten Pfad zu dem Verzeichnis ein in dem das Shared Object liegt und teste dagegen. Ggf.: schreib Dir ein kleines Bash-Skript das den LibraryPath setzt und dann poly per exec startet und ruf dieses Skript aus dem Java auf.

Ebenius
 

nemo86

Mitglied
Vielen Dank, jetzt kalappt alles. Am Ende sieht es dann so aus:

Java:
class StreamPipe implements Runnable {

	final InputStream input;
	final PrintStream output;

	StreamPipe(InputStream input, PrintStream output) {
		this.input = input;
		this.output = output;
	}
	

	public void run() {
		int b;
		try {
			while ((b = input.read()) != -1) {
				output.write(b);
			}
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
}

import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Map;

public class PolyMl {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException,
			InterruptedException {

		final ProcessBuilder pb = new ProcessBuilder(
				"/usr/public/polyml-5.2.1/x86-linux/poly");

		final String nLibPath = "/usr/public/polyml-5.2.1/x86-linux";

		final Map<String, String> env = pb.environment();
		String envLD_LIBRARY_PATH = env.get("LD_LIBRARY_PATH");
		if (envLD_LIBRARY_PATH != null && !envLD_LIBRARY_PATH.equals("")) {
			envLD_LIBRARY_PATH = envLD_LIBRARY_PATH + File.pathSeparator
					+ nLibPath;
		} else {
			envLD_LIBRARY_PATH = nLibPath;
		}
		env.put("LD_LIBRARY_PATH", envLD_LIBRARY_PATH);

		final Process process = pb.start();
		new Thread(new StreamPipe(process.getInputStream(), System.out))
				.start();
		new Thread(new StreamPipe(process.getErrorStream(), System.err))
				.start();

		final PrintStream stdin = new PrintStream(process.getOutputStream());
		stdin.println("fun f () = print \"Hello World\\n\";");
		stdin.println("...");
		stdin.flush();
		process.waitFor();
	}

}
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
X jvm exception abfangen und an externes Programm schicken Allgemeine Java-Themen 4
Thallius Herausfinden ob ein externes Programm schon gestartet ist? Allgemeine Java-Themen 10
H Externes Programm, Parameter Allgemeine Java-Themen 6
T Externes Programm auf anderem Bildschirm starten Allgemeine Java-Themen 3
F Externes Programm starten, Speicheraufwändig Allgemeine Java-Themen 7
M in Abhänigkeit vom FileFilter, externes Programm ausführen Allgemeine Java-Themen 12
F externes Programm beginnt erst nach dem ende des mainprogrammes Allgemeine Java-Themen 3
H Externes Programm in JAR einbinden Allgemeine Java-Themen 11
X Aus Java Applikation externes Programm starten Allgemeine Java-Themen 3
J Externes Programm - Konsolenausgabe kopieren/sichtbar machen Allgemeine Java-Themen 22
J Externes Programm starten und stoppen (Linux) Allgemeine Java-Themen 3
B Externes Programm starten - Konsolenausgabe anzeigen lassen? Allgemeine Java-Themen 2
P Externes Programm starten und beeinflussen Allgemeine Java-Themen 11
S externes programm Allgemeine Java-Themen 6
padde479 Externes Programm starten Allgemeine Java-Themen 7
C externes Programm läuft erst nach schließen des mainprogramm Allgemeine Java-Themen 7
T Mit java externes Programm starten Allgemeine Java-Themen 4
W Externes Programm beenden mit eigenem Programm beenden Allgemeine Java-Themen 7
M Externes Programm ausführen Allgemeine Java-Themen 2
M externes Programm aus Java heraus starten Allgemeine Java-Themen 2
O Maven ein externes jar laden ohne die Applikation neu zu kompilieren Allgemeine Java-Themen 4
S externes Mehrweg-Mischen Allgemeine Java-Themen 3
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
E Externes bat sichtbar ausführen Allgemeine Java-Themen 4
L Externes Bash Script aus Java Datei heraus starten Allgemeine Java-Themen 2
N externes Sortieren (MergeSort Allgemeine Java-Themen 2
Jose05 Umgang mit Exceptions in einen Programm Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
T Der Aufruf von CMD-Programm Allgemeine Java-Themen 30
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
Mike80 Processing Programm fiert ohne Arduino ein Allgemeine Java-Themen 2
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
districon Programm zum Durchsuchen von (Ebay-)Artikeln Allgemeine Java-Themen 1
T Addons im eigenen Programm Allgemeine Java-Themen 1
Calli11 Was muss ich hier in die Main schreiben, damit das Programm ausgeführt wird? Allgemeine Java-Themen 4
S .exe Datei/Programm auslesen? Allgemeine Java-Themen 2
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
B Java Programm auf virutellem Desktop laufen lassen? Allgemeine Java-Themen 1
L Java überprüfen lassen, ob sich ein gegebener Pfad / das Programm an sich auf einer CD oder Festplatte befindet Allgemeine Java-Themen 14
Tiago1234 Warum hängt sich mein Programm auf? Allgemeine Java-Themen 22
D Programm designen Allgemeine Java-Themen 1
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
J c Programm läuft nicht in compilierter Version des Java Projektes Allgemeine Java-Themen 7
O 2D-Grafik BioFarben-Programm soll auf Vollbild schalten Allgemeine Java-Themen 1
S Nachrichten Filter Programm Allgemeine Java-Themen 14
S Programm schreiben, das mir aufgrund von Schlagwörtern, die ich im Internet suche, relevante Themen sofort anzeigt. Allgemeine Java-Themen 1
T Hilfe bei Programm. IDE: Eclipse mit EV3-Plugin, lejos Allgemeine Java-Themen 8
Lukas2904 Swing Anzeigen lassen das das Programm geschlossen wurde Allgemeine Java-Themen 3
TechnikTVcode Mail Programm Allgemeine Java-Themen 2
S Programm entwickeln, welches ein Dreieckspuzzle lösen kann Allgemeine Java-Themen 5
R Lesen von Interfaces (Programm Vervollständigen) Allgemeine Java-Themen 10
Dann07 Java-Programm findet DLLs nicht! Allgemeine Java-Themen 20
OSchriever Linux-Programm öffnen Allgemeine Java-Themen 6
P USER Management in SQL übergreifend auf JAVA Programm Allgemeine Java-Themen 41
L Eclipse Konsole im exportierten Programm Allgemeine Java-Themen 2
OSchriever Programm über Linux-Kommandozeile ausführen Allgemeine Java-Themen 20
D Verkauf von einem Programm welches ich in Java geschrieben habe Allgemeine Java-Themen 4
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
P Erstelltes Programm ist doppelt so groß Allgemeine Java-Themen 11
N Programm nach Abschluss neustarten lassen Allgemeine Java-Themen 6
S Einfaches Programm programmieren Allgemeine Java-Themen 5
M kleines KI Programm Idee Allgemeine Java-Themen 7
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
N Programm startet nicht, nur per cmd Allgemeine Java-Themen 5
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
E Java Programm mit Clients erweitern - Möglichkeiten? Allgemeine Java-Themen 2
Joker4632 Methoden Befehl an bereits extern geöffnete Programm-spezifische Konsole senden Allgemeine Java-Themen 1
M Dieses Programm schneller machen? Allgemeine Java-Themen 2
R Programm zur Rekursion Allgemeine Java-Themen 5
N Quicksort Programm hängt sich auf Allgemeine Java-Themen 6
S Compiler-Fehler Programm verhält sich in Eclipse anders Allgemeine Java-Themen 1
B Input/Output Programm zum Auslesen/Beschreiben von Textdateien, wie Geschwindigkeit erhöhen? Allgemeine Java-Themen 18
dereki2000 Programm veröffentlichen Allgemeine Java-Themen 14
mrbig2017 Threads Chat Programm mit Threads? Allgemeine Java-Themen 2
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
J Java "Bank Programm" Brauche eure Hilfe Allgemeine Java-Themen 3
S Java Programm (Spiel mit den Boxen) Allgemeine Java-Themen 1
kodela Programm hängt in der Ereigniswarteschlange Allgemeine Java-Themen 13
A Java Programm verbessern/vereinfachen Allgemeine Java-Themen 20
P Programm darf nicht mehrfach startbar sein Allgemeine Java-Themen 16
S Programm hängt sich manchmal (selten) auf Allgemeine Java-Themen 9
JavaNewbie2.0 Programm nicht im Taskmanager schliesen können Allgemeine Java-Themen 15
J XML Datei mit installiertem Programm öffnen Allgemeine Java-Themen 7
Arif Input/Output Dateien im Jar-Programm speichern Allgemeine Java-Themen 12
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
JavaNewbie2.0 Programm bleibt "stehen" Allgemeine Java-Themen 2
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
Aruetiise Methoden .jar mit Programm öffnen Allgemeine Java-Themen 2
C anderes Programm schließen! Allgemeine Java-Themen 5
C Webseiten Programm problem Allgemeine Java-Themen 5
E Programm auf Installation prüfen Allgemeine Java-Themen 1

Ähnliche Java Themen

Neue Themen


Oben