|
2.12.2 外部プログラム
ほとんどすべての機種のコンピュータで,Mathematicaから外部のプログラムやコマンドを実行することができる.しばしば Mathematicaで生成した式を外部のプログラムに受け渡し,あるいは逆に外部のプログラムの出力を Mathematicaで受け取ることが必要になる.
Mathematicaは構造化 (structured)と非構造化(unstructured)の2種類の形式の外部プログラムとの交信をサポートする.

2種類の Mathematicaと外部ファイルのやり取り
構造化された交信は,Mathematicaの式をこれを扱えるように設定された外部プログラムとやり取りをすることである.その基礎になるのは MathLinkで,これは 2.13で解説される.
非構造化交信は,通常のテキストの外部プログラムとのやり取りである.外部プログラムはおおむねファイルとして取り扱われ,同様の読み書きの機能をサポートする.

外部プログラムの読み書き
一般に,普通のファイル名を使えるときは,Mathematicaではその代りにパイプを使うことができ,その書式は記号 !に続いて外部コマンドを書けばよい.パイプを使うときは,Mathematicaは外部コマンドを実行し,テキストのやり取りを行う.
FactorIntegerの結果を外部プログラム lprに送る.多くの Unixシステムで,このプログラムはプリントを行う.
In[1]:= FactorInteger[2^31 - 1] >> !lpr
外部コマンド echo $TERMを実行し,その結果を Mathematicaで入力式として読み 込む.
In[2]:= <<"!echo $TERM"
1つ注意することは,文字列がスペースやその他の特殊記号を含まなければ,パイプの式で <<または >>の右辺の2重引用符 "を省略することができることである.
Mathematicaのパイプは外部プログラムとの非構造化通信の極めて一般的なメカニズムを提供する.多くのコンピュータで,Mathematicaのパイプはそれぞれのオペーレーティングシステム固有のパイプを使って実装されている.ただし,場合によってはプロセス間の通信メカニズムが使われることもある.Mathematicaの非構造化通信における1つの制限は,パイプは一度に入力または出力の一方に使うことができるが,両方同時には使えないことである.厳密な双方向の通信は MathLinkを利用するしかない.
非構造化通信においても,テンポラリファイルを使って幾分複雑な構成を行うことが可能である.基本的な考え方は,まずデータをファイルに書き込み,それを必要に応じて読み出すことである.

テンポラリファイルを開く
テンポラリファイルを取り扱う際に,Mathematicaとデータのやり取りをしない外部コマンドを実行すると便利なことが多い.これは Mathematica関数 Runを使って実現される.

入出力を伴わない外部コマンドの実行
Unixコマンド dateを実行する.オペレーティングシステムからは "exit code"が返される.
In[3]:= Run["date"]

Out[3]= 
Runを実行するときに,その前に !記号を付けないことに注意する.Runは単に与えた引数をテキストとして受け取り,複数の引数の場合はこれらをスペースで区切ってつなぎ合わせてできる文字列を外部コマンドとして実行する.
Runは外部コマンドのいかなる出力も取り込むことはない.したがって,その出力が行く先はオペレーティングシステムによって決まる.同様に,Runは外部コマンドに入力を補足することはない.これは,コマンドはオペレーティングシステムによって提供されるメカニズムによって入力を受け取ることを意味する.外部コマンドが Mathematicaが利用するのと同じ入力や出力にアクセスできることもあり,便利なことも多い.しかし,Mathematicaをフロントエンドから使っている場合は,このような使い方はかなりの混乱を招く恐れがある.

Mathematicaのシェルエスケープ
テキスト型のインターフェースで Mathematicaを使うとき,外部コマンドを実行するには普通特別なメカニズムを使う.そのようなインターフェースでは,Mathematicaは !から始まる入力行を取り,残りの文字列を外部コマンドとして実行する.
Mathematicaが !commandを使う方法は,Unixシステムにおけるシェルエスケープの典型的な方法である.ほとんどのバージョンの Mathematicaでは,!のみからなる1行を入力すると,Mathematicaから対話的なシェルを起動することができる.
この入力はシェルエスケープとなり,Unixコマンド dateを実行する.
In[4]:= !date

Out[4]= 

外部プログラムでの Mathematica式の実行
上で述べたように,<<や >>は外部プログラムと入力と出力を同時にやり取りできない.しかし,非構造化通信においても,テンポラリファイルを使えば実効的に外部プログラムとの入出力のやり取りができる.
関数 RunThroughは式のテキストをテンポラリファイルに書き出し,これを外部プログラムに入力として引き渡し,続いてその出力を Mathematicaの入力として読み込む.RunThroughでも,Runと同様,初めに !をおいてはいけない.
式 789を外部プログラム catに引き渡す.このプログラムは単に与えられたテキストをエコーバックする.この catの出力は Mathematicaに読み込まれる.
In[5]:= RunThrough["cat", 789]
Out[5]= 
|