外部プログラム
ほとんどすべての機種のコンピュータで,
Mathematica から外部のプログラムやコマンドを実行することができる.しばしば
Mathematica で生成した式を外部のプログラムに受け渡し,あるいは逆に外部のプログラムの出力を
Mathematica で受け取ることが必要になる.
Mathematica は構造化(
structured)と非構造化(
unstructured)の2種類の形式の外部プログラムとの交信をサポートする.
| 構造化 | MathLink を使ってこれと互換的な外部プログラムとのやり取りをする |
| 非構造化 | テキストファイルを使ってこれを読み書きする |
2種類のMathematicaと外部ファイルのやり取り
構造化された交信は,
Mathematica の式をこれを扱えるように設定された外部プログラムとやり取りをすることである.その基礎になるのは
MathLink で,これは
「MathLinkと外部プログラム通信」で解説される.
非構造化交信は,通常のテキストの外部プログラムとのやり取りである.外部プログラムはおおむねファイルとして取り扱われ,同様の読み書きの機能をサポートする.
| expr>>"!command" | 式をテキストとして外部プログラムに送る |
| <<"!command" | 外部プログラムからテキストを読み込んでMathematica の入力とする |
外部プログラムの読み書き
一般に,普通のファイル名を使えるときは,
Mathematica ではその代りにパイプを使うことができ,その書式は記号
!に続いて外部コマンドを書けばよい.パイプを使うときは,
Mathematica は外部コマンドを実行し,テキストのやり取りを行う.
外部コマンド echo$TERMを実行し,その結果を Mathematica で入力式として読み込む.
| Out[2]= |  |
|
ひとつ注意することは,文字列がスペースやその他の特殊記号を含まなければ,パイプの式で
<<または
>>の右辺のダブルクォート
"を省略することができることである.
Mathematica のパイプは外部プログラムとの非構造化通信の極めて一般的なメカニズムを提供する.多くのコンピュータで,
Mathematica のパイプはそれぞれのオペレーティングシステム固有のパイプを使って実装されている.ただし,場合によってはプロセス間の通信メカニズムが使われることもある.
Mathematica の非構造化通信におけるひとつの制限は,パイプは一度に入力または出力の一方に使うことができるが,両方同時には使えないことである.厳密な双方向の通信は
MathLink を利用するしかない.
非構造化通信においても,「テンポラリファイル」を使って幾分複雑な構成を行うことが可能である.基本的な考え方は,まずデータをファイルに書き込み,それを必要に応じて読み出すことである.
「テンポラリファイル」を開く
テンポラリファイルを取り扱う際に,
Mathematica とデータのやり取りをしない外部コマンドを実行すると便利なことが多い.これは
Mathematica 関数
Runを使って実現される.
| Run["command",arg1,...] | Mathematica から外部コマンドを走らせる |
入出力を伴わない外部コマンドの実行
Unixコマンド dateを実行する.オペレーティングシステムからは"exit code"が返される.
| Out[3]= |  |
|
Runを実行するときに,その前に
!記号を付けないことに注意する.
Runは単に与えた引数をテキストとして受け取り,複数の引数の場合はこれらをスペースで区切ってつなぎ合せてできる文字列を外部シェルコマンドとして実行する.
Runは外部コマンドのいかなる出力も取り込むことはない.したがって,その出力が行く先はオペレーティングシステムによって決まる.同様に,
Runは外部コマンドに入力を補足することはない.これは,コマンドはオペレーティングシステムによって提供されるメカニズムによって入力を受け取ることを意味する.外部コマンドが
Mathematica が利用するのと同じ入力や出力にアクセスできることもあり,便利なことも多い.しかし,
Mathematica をフロントエンドから使っている場合は,このような使い方はかなりの混乱を招く恐れがある.
| !command | Mathematica の入力を避け,コマンドを外部コマンドとして実行 |
Mathematica のテキスト型インターフェースでシェルエスケープを使う
テキスト型のインターフェースで
Mathematica を使うとき,外部コマンドを実行するには普通特別なメカニズムを使う.そのようなインターフェースでは,
Mathematica は
!から始まる入力行を取り,残りの文字列を外部コマンドとして実行する.
Mathematicaが
!command を使う方法は,Unixシステムにおけるシェルエスケープの典型的な方法である.ほとんどのバージョンの
Mathematica では,
!のみからなる1行を入力すると,
Mathematica から対話的なシェルを起動することができる.
テキスト型のインターフェースでは,この入力は「シェルエスケープ」となり,Unixコマンド dateを実行する.
| Out[4]= |  |
|
| RunThrough["command",expr] | expr を入力としてcommand を実行し,返される結果をMathematica に読み込む |
外部プログラムでのMathematica 式の実行
上で述べたように,
<<や
>>は外部プログラムと入力と出力を同時にやり取りできない.しかし,非構造化通信においても,テンポラリファイルを使えば実効的に外部プログラムとの入出力のやり取りができる.
関数
RunThroughは式のテキストをテンポラリファイルに書き出し,これを外部プログラムに入力として引き渡し,続いてその出力を
Mathematica の入力として読み込む.
RunThroughでも,
Runと同様,初めに
!をおいてはいけない.
式 789を外部プログラム catに引き渡す.このプログラムは単に与えられたテキストをエコーバックする.この catの出力は Mathematica に読み込まれる.
| Out[5]= |  |
|