This is documentation for Mathematica 4, which was
based on an earlier version of the Wolfram Language.
View current documentation (Version 11.1)

 Documentation /  Mathematica /  Das Mathematica Buch /  Die Prinzipien von Mathematica /  Dateien und Ströme /

Lesen und Schreiben von Mathematica-DateienFortgeschrittenes Thema: Ströme und Ein- und Ausgabe auf elementarer Ebene

2.11.2 Externe Programme

Auf den meisten Computersystemen können Sie externe Programme oder Anweisungen aus Mathematica heraus ausführen. Oft werden Sie Ausdrücke, die durch Mathematica erzeugt wurden, an externe Programme senden oder Ergebnisse externer Programme in Mathematica einlesen wollen.

Mathematica unterstützt zwei Grundformen der Kommunikation mit externen Programmen: strukturierte und unstrukturierte.

Zwei Arten der Kommunikation mit externen Programmen in Mathematica

Das Prinzip der strukturierten Kommunikation besteht darin, vollständige Mathematica-Ausdrücke mit externen Programmen, die speziell für den Umgang mit solchen Objekten konstruiert wurden, auszutauschen. Die Grundlage für die strukturierte Kommunikation bildet das MathLink-System (siehe Abschnitt 2.12).

Die unstrukturierte Kommunikation besteht aus dem Senden und Empfangen gewöhnlicher Texte nach und von externen Programmen. Die Grundidee ist, ein externes Programm ähnlich wie eine Datei zu behandeln, sowie die gleichen Arten von Lese- und Schreiboperationen zu unterstützen.

Lesen und Schreiben mit externen Programmen

Im allgemeinen können Sie in Mathematica überall anstelle gewöhnlicher Dateinamen eine Pipe angeben, die als externe Anweisung mit vorangestelltem Ausrufezeichen geschrieben wird. Wenn Sie die Pipe benutzen, wird Mathematica die externe Anweisung ausführen und Text zu ihr senden oder von ihr empfangen.

Hier wird das Ergebnis von FactorInteger zum externen Programm lpr gesendet. Auf vielen Unix-Systemen erzeugt dieses Programm eine Druckausgabe.

In[1]:= FactorInteger[2^31 - 1] >> !lpr

Dadurch wird die externe Anweisung echo $TERM ausgeführt und dann das Ergebnis als Mathematica-Eingabe gelesen.

In[2]:= <<"!echo $TERM"

Out[2]=

Ein Punkt, den Sie beachten sollten: Die Anführungszeichen um den Pipenamen rechts von << oder >> können entfallen, sofern der Name keine Leerzeichen oder andere Sonderzeichen enthält.

Pipes in Mathematica bieten einen sehr allgemeinen Mechanismus zur unstrukturierten Kommunikation mit externen Programmen. Auf vielen Computersystemen sind die Mathematica-Pipes mittels der Pipe-Mechanismen des zugrundeliegenden Betriebssystems implementiert; in einigen Fällen werden jedoch andere Mechanismen zur Interprozeß-Kommunikation benutzt. Eine Einschränkung der unstrukturierten Kommunikation in Mathematica besteht darin, daß eine Pipe entweder nur zur Ein- oder nur zur Ausgabe benutzt werden kann, aber nicht gleichzeitig für beide. Für eine echte Zweiwege-Kommunikation benötigen Sie MathLink.

Auch bei der unstrukturierten Kommunikation können Sie mit temporären Dateien kompliziertere Systeme aufbauen. Die Grundidee besteht darin, Daten in eine Datei zu schreiben, und diese dann bei Bedarf zu lesen.

Öffnen einer temporären Datei

Besonders beim Arbeiten mit temporären Dateien kann es nützlich sein, externe Anweisungen ausführen zu können, die nicht explizit Daten an Mathematica senden oder empfangen. Dies wird mit der Mathematica-Funktion Run erreicht.

Ausführen externer Anweisungen ohne Ein- oder Ausgabe

So führt man die externe Unix-Anweisung date aus. Der Rückgabewert ist ein „Exit-Code" des Betriebssystems.

In[3]:= Run["date"]

Out[3]=

Beachten Sie: Beim Einsatz von Run dürfen einer Anweisung kein Ausrufezeichen vorangestellt werden. Run nimmt einfach die Textform der Argumente, setzt diese durch Leerzeichen getrennt zusammen und führt die sich daraus ergebende Zeichenkette als externe Anweisung aus.

Es ist wichtig zu wissen, daß Run niemals die Ausgabe einer externen Anweisung „einfängt". Folglich bestimmt allein Ihr Betriebssystem, wohin die Ausgabe geht. Außerdem liefert Run keine Eingabe für externe Anweisungen. Das bedeutet, daß die Anweisungen Eingaben nur durch die von Ihrem Betriebssystem bereitgestellten Mechanismen erhalten können. Manchmal können externe Anweisungen Zugriff zu denselben Ein- und Ausgabeströmen haben, die auch von Mathematica benutzt werden. In einigen Fällen mag das Ihren Wünschen entsprechen. Aber besonders dann, wenn Sie Mathematica mit einer Benutzeroberfläche verwenden, kann dies zu beträchtlichen Störungen führen.

Shell-Rücksprünge in Mathematica

Wenn Sie Mathematica mit einer textorientierten Schnittstelle benutzen, steht Ihnen normalerweise ein spezieller Mechanismus zur Ausführung externer Anweisungen zur Verfügung. Bei einer solchen Schnittstelle nimmt Mathematica jede Zeile der Eingabe, die mit einem Ausrufezeichen beginnt, und führt den Rest des Textes auf dieser Zeile als externe Anweisung aus.

Die Art, wie Mathematica !anweisung verwendet, ist charakteristisch für die Art, wie „Shell-Rücksprünge" in Programmen unter dem Betriebssystem Unix funktionieren. In den meisten Mathematica-Versionen können Sie eine interaktive Shell aus Mathematica heraus einfach durch die Eingabe eines auf einer Zeile alleinstehenden Ausrufezeichens starten.

Diese Zeile wird als „Shell-Rücksprung" interpretiert und führt die Unix-Anweisung date aus.

In[4]:= !date

Out[4]=

Mathematica-Ausdrücke durch externe Programme schleusen

Wie bereits erläutert, können << und >> nicht gleichzeitig zum Senden und Empfangen von Daten aus externen Programmen eingesetzt werden. Im Grunde kann man mittels temporärer Dateien dennoch Daten sowohl senden als auch von externen Programmen empfangen und dabei unstrukturierte Kommunikation benutzen.

Die Funktion RunThrough schreibt den Text eines Ausdrucks in eine temporäre Datei, führt diese einem externen Programm als Eingabe zu und fängt die Ausgabe als Mathematica-Eingabe ab. Beachten Sie, daß Sie bei RunThrough, wie bei Run, externe Anweisungen nicht mit Ausrufezeichen einleiten sollten.

Dies führt den Ausdruck 789 dem externen Programm cat zu, das in diesem Fall den Ausdruck einfach als Echo zurückgibt. Die Ausgabe von cat wird dann wieder in Mathematica eingelesen.

In[5]:= RunThrough["cat", 789]

Out[5]=

Lesen und Schreiben von Mathematica-DateienFortgeschrittenes Thema: Ströme und Ein- und Ausgabe auf elementarer Ebene