Mathematica スクリプト

スクリプトファイル

Mathematica スクリプトは Mathematica セッションで逐次評価する Mathematica コマンドを含むファイルである.コマンドを何度も繰り返す必要がある場合は,スクリプトを書くと便利である.これらのコマンドを集めることで,どのコマンドを省略することもなく,特定の順序で確実に評価するようにできる.複雑で長い計算を実行する場合,これは非常に重要である.Mathematica スクリプトは通常,拡張子.mを持つ Mathematica ソース形式のファイルとして書かれる.

Mathematica をインタラクティブに使う場合,スクリプトファイルに含まれるコマンドはGetを使って評価することができる.この関数は自分で書いたコードや他の.mファイルでプログラムで使うこともできる.

Get["file"]ファイルを読み込みその中のコマンドを評価する
<<fileGetの短い形式

スクリプトファイルからコマンドを読み込む

スクリプトファイルの構造には必要条件はない.ファイルで与えられる Mathematica コマンドの列が読まれ,逐次評価される.コードがただのコマンドのリストよりも複雑なものである場合は,「パッケージ」で説明するように,より構造化されたパッケージを書いた方がよいかもしれない.

Mathematica スクリプトは,インタラクティブなセッションが必要ないとき,つまり,スクリプトが実行される必要のある1つの計算をカプセル化するときにより便利である.例えば,計算に線形代数,最適化,数値積分,微分方程式の解法等の要求の高い計算タスクが含まれている場合や,タイプセット,動的インタラクティブ機能,ノートブックを使わない場合等である..

スクリプトの実行

スクリプトファイルは,MathKernelかmath実行ファイルがパス上にあり見付けられる場合は,コマンドラインから Mathematica カーネルを起動するときに使うことができる.

$ MathKernel -script file.m

Mac OS Xでのスクリプトファイルの実行

$ math -script file.m

Linuxでのスクリプトの実行

-scriptコマンドラインオプションは Mathematica カーネルが特殊スクリプトモード(すなわちバッチモード)で実行されるよう指定する.このモードでは,カーネルは指定されたファイルを読み込み,そのコマンドを逐次評価する.カーネルは,出力関数のPageWidthオプションをInfinityに設定することでデフォルトの改行をオフにし,In[]およびOut[]ラベルを出力しないようにすることができる.

このモードで実行すると,標準の入出力チャンネルはリダイレクトされず,出力はInputFormで返される.従って,スクリプトの出力はファイルの中に保存することができ,逐次 Mathematica の中に読み戻すことができる.この出力は他のスクリプトに渡すのにも適しているので,スクリプトコマンドを評価するMathKernelプロセスは他のプロセスでパイプで使用することができる.

-scriptオプションでMathKernelを実行することはGetコマンドを使ってファイルを読み込むことと同じである.ただ1点違うのは,前者はファイルの中の最後のコマンドが評価された後,カーネルが終了するという点である.この動作は MathLink 接続や,スクリプトを実行している外部プロセスに影響を及ぼす可能性がある.

Unixスクリプト実行ファイル

Unixのようなオペレーティングシステムでは,実行可能にすることができて通常の実行可能プログラムとして実行することのできるスクリプトを書くことができる.これはファイルの最初に「インタプリタ」行を置くことで行うことができる.Mathematica コマンドを含むスクリプトでも同じことができる.

「インタプリタ」行は2つの記号「#!」で構成されており,ファイルの最初の記号となる.この後にMathematicaScriptインタプリタへの絶対パス,その次に他の引数が続く.インタプリタ行の最後の引数は-scriptでなければならない.MathematicaScriptインタプリタは Mathematica に含まれている.

#!/usr/local/bin/MathematicaScript -script

(* generate high-precision samples of a mixed distribution *)
Print /@ RandomVariate[MixtureDistribution[
{1,2},
{NormalDistribution[1,2/10],
NormalDistribution[3,1/10]}],
10, WorkingPrecision -> 50]

スクリプトファイルの例

スクリプトを起動するのに使われるオペレーティングシステムのメカニズムは,ファイルを見付けるのにPATHや他の方法を使わないので,インタプリタへのパスは絶対パスでなければならない.またパスにはスペースが含まれていてもいけない.絶対パスにスペースが含まれる場所に Mathematica がインストールしてある場合,適切な場所のMathematicaScriptへのシンボリックリンクを作成する必要がある.シンボリックリンクの絶対パスはインタプリタ行で与えればよい.これで適切に処理される.

スクリプトを実行可能にするためには,実行可能許可を設定する必要がある.その後はシェルプロンプトにスクリプト名をタイプするだけでスクリプトが実行できる.

$ chmod a+x script.m
$ script.m

スクリプトを実行可能にし,実行する

MathematicaScriptインタプリタはシステム環境を設定し,Mathematica カーネルを起動する.Mathematica スクリプトを実行することは,MathKernel -script scriptname.mを実行することと全く同じである.

インタプリタ行は,インタプリタパスと-scriptオプションの間に置かれた他の追加的なパラメータを含むことができる.これらのパラメータはMathKernel実行ファイルに渡される.可能なパラメータはMathKernelページで指定される.

#!/usr/local/bin/MathematicaScript -pwfile "file" -script

追加のパラメータを使ったインタプリタ行

Mathematica スクリプトは.m拡張子を持っている必要はない.実行可能スクリプトはUnixオペレーティングシステムの他のプログラムと同様のフル機能のプログラムなので,ジョブコントロール等に従って,他のスクリプト内,パイプ内で使うことができる.それぞれの Mathematica スクリプトはそれ自身のMathKernelを起動し,変数や定義を共有しない.Mathematica スクリプトを同時に実行することは,同時に起動できるカーネル数に関するライセンスの制約を受けることがある.

実行可能スクリプトファイルはインタラクティブな Mathematica セッションに透過的に読み込んで評価することができる.Getコマンドは,スクリプトが#!の記号で始まっている場合,通常スクリプトの1行目を無視する.

スクリプトパラメータ

Mathematica スクリプトを実行するとき,コマンドラインでパラメータを指定することによりスクリプトの動作を変更したいと思うこともあるだろう.Mathematica コードでは$ScriptCommandLineにより Mathematica スクリプトに渡されたパラメータにアクセスすることができる.

#!/usr/local/bin/MathematicaScript -script

(* generate "num" samples of a mixed distribution *)
num = ToExpression[$ScriptCommandLine[[2]]];
Print /@ RandomVariate[
MixtureDistribution[
{1, 2},
{NormalDistribution[1, 0.2],
NormalDistribution[3, 0.1]}
], num, WorkingPrecision -> 50]

コマンドラインパラメータを使ったスクリプトファイルfile.mの例

$ file.m 10

スクリプトを実行し,サンプルの数を指定する

スクリプト内でアクセスされる場合,$ScriptCommandLineは第1要素としてスクリプトの名前を含み,残りはコマンドラインの引数である.$ScriptCommandLineは標準のargv[]規約に従う.

Unixのようなオペレーティングシステムのスクリプトの実行方法があるため,$ScriptCommandLineMathematica カーネルがMathematicaScriptメカニズムを介して起動されたときだけ非空のリストに設定される.スクリプトがバッチモードおよびスタンドアロンのUnixスクリプトの両方で実行される,あるいはUnixとWindowsの両方の環境で実行されるように意図されている場合,$ScriptCommandLineはどのようにスクリプトを実行するかを決定するために使うことができる.その後,コマンドライン引数にアクセスするためには,$ScriptCommandLine$CommandLineの両方を使わなければならない.

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