外部プログラム

ほとんどすべての機種のコンピュータで,Mathematica から外部のプログラムやコマンドを実行することができる.しばしば Mathematica で生成した式を外部のプログラムに受け渡し,あるいは逆に外部のプログラムの出力を Mathematica で受け取ることが必要になる.

Mathematica は構造化(structured)と非構造化(unstructured)の2種類の形式の外部プログラムとの交信をサポートする.

構造化MathLink を使ってこれと互換的な外部プログラムとのやり取りをする
非構造化テキストファイルを使ってこれを読み書きする

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

構造化された交信は,Mathematica の式をこれを扱えるように設定された外部プログラムとやり取りをすることである.その基礎になるのは MathLink で,これはMathLinkと外部プログラム通信」で解説される.

非構造化交信は,通常のテキストの外部プログラムとのやり取りである.外部プログラムはおおむねファイルとして取り扱われ,同様の読み書きの機能をサポートする.

<<fileファイルを読み込む
<<"!command"外部コマンドを実行し,それにより生成される出力を読み込む
expr>>"!command"expr をテキスト形式で外部コマンドにフィードする
ReadList["!command",Number]外部コマンドを実行し,それにより生成されるリストを読み込む

外部プログラムとの通信方法の例

一般に,普通のファイル名を使えるときは,Mathematica ではその代りにパイプを使うことができ,その書式は感嘆符に続いて外部コマンドを書けばよい.パイプを使うときは,Mathematica は外部コマンドを実行し,テキストのやり取りを行う.

FactorIntegerの結果を外部プログラムに送る.多くのUnixシステムで,このプログラムはプリントを行う.
In[1]:=
Click for copyable input
外部コマンドを実行し,その結果を Mathematica で入力式として読み込む.
In[2]:=
Click for copyable input
Out[2]=
テキストベースのインターフェースでは,行頭にを置くことでその行の残りの部分が外部コマンドとして実行される.は数とその2乗を出力する外部プログラムである.
In[1]:= !squares 4

1 1
2 4
3 9
4 16
以下は,外部コマンドを実行してから,生成される出力から数値を読み込む.
In[3]:=
Click for copyable input
Out[3]=

ひとつ注意することは,文字列がスペースやその他の特殊記号を含まなければ,パイプの式でまたはの右辺のダブルクォートを省略することができることである.

Mathematica のパイプは外部プログラムとの非構造化通信の極めて一般的なメカニズムを提供する.多くのコンピュータで,Mathematica のパイプはそれぞれのオペレーティングシステム固有のパイプを使って実装されている.ただし,場合によってはプロセス間の通信メカニズムが使われることもある.Mathematica の非構造化通信におけるひとつの制限は,パイプは一度に入力または出力の一方に使うことができるが,両方同時には使えないことである.厳密な双方向の通信は MathLink を利用するしかない.

非構造化通信においても,「テンポラリファイル」を使って幾分複雑な構成を行うことが可能である.基本的な考え方は,まずデータをファイルに書き込み,それを必要に応じて読み出すことである.

OpenWrite[]テンポラリファイルを固有の名前で開く

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

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

Run["command",arg1,...]Mathematica から外部コマンドを走らせる

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

Unixコマンドを実行する.オペレーティングシステムからは「終了コード」が返される.
In[4]:=
Click for copyable input
Out[4]=

Runを実行するときに,その前に感嘆符を付けないことに注意する.Runは単に与えた引数をテキストとして受け取り,複数の引数の場合はこれらをスペースで区切ってつなぎ合せてできる文字列を外部シェルコマンドとして実行する.

Runは外部コマンドのいかなる出力も取り込むことはない.したがって,その出力が行く先はオペレーティングシステムによって決まる.同様に,Runは外部コマンドに入力を補足することはない.これは,コマンドはオペレーティングシステムによって提供されるメカニズムによって入力を受け取ることを意味する.外部コマンドが Mathematica が利用するのと同じ入力や出力にアクセスできることもあり,便利なことも多い.しかし,Mathematica をフロントエンドから使っている場合は,このような使い方はかなりの混乱を招く恐れがある.

RunThrough["command",expr]expr を入力として command を実行し,返される結果を Mathematica に読み込む

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

上で述べたように,は外部プログラムと入力と出力を同時にやり取りできない.しかし,非構造化通信においても,テンポラリファイルを使えば実効的に外部プログラムとの入出力のやり取りができる.

関数RunThroughは式のテキストをテンポラリファイルに書き出し,これを外部プログラムに入力として引き渡し,続いてその出力を Mathematica の入力として読み込む.RunThroughでも,Runと同様,初めに感嘆符をおいてはいけない.

を外部プログラムに引き渡す.このプログラムは単に与えられたテキストをエコーバックする.このの出力は Mathematica に読み込まれる.
In[5]:=
Click for copyable input
Out[5]=
SystemOpen["target"]使用中のコンピュータシステム上で,指定されたファイル,URL,プログラムに関連付けられたその他のターゲットを開く

外部プログラムでファイルを開く

使用中のシステムで設定してあるWebブラウザを使ってURLを開く.
In[6]:=
Click for copyable input

SystemOpenは使用中のオペレーティングシステムでの設定を使い,URIやファイルを開く方法を決定する.ファイルを開くとき,ファイルのアイコンをダブルクリックしたときに起動するのと同じプログラムが使われる.

New to Mathematica? Find your learning path »
Have a question? Ask support »