Mathematica 9 is now available
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.
Mathematica >

外部プログラム

ほとんどすべての機種のコンピュータで,Mathematica から外部のプログラムやコマンドを実行することができる.しばしばMathematica で生成した式を外部のプログラムに受け渡し,あるいは逆に外部のプログラムの出力をMathematica で受け取ることが必要になる.
Mathematica は構造化(structured)と非構造化(unstructured)の2種類の形式の外部プログラムとの交信をサポートする.
構造化MathLink を使ってこれと互換的な外部プログラムとのやり取りをする
非構造化テキストファイルを使ってこれを読み書きする

2種類のMathematicaと外部ファイルのやり取り

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

外部プログラムの読み書き

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

「テンポラリファイル」を開く

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

入出力を伴わない外部コマンドの実行

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

Mathematica のテキスト型インターフェースでシェルエスケープを使う

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

外部プログラムでのMathematica 式の実行

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