Mathematica 脚本

脚本文件

Mathematica 脚本是一个包含 Mathematica 命令的文件,用户通常可以在一个 Mathematica 会话中按顺序计算这些命令. 如果这些命令需要多次重复,编写一个脚本就是非常有用的. 把这些命令收集在一起确保它们按照特定的顺序计算,并且没有忽略任何命令. 如果用户运行复杂的、很长的计算,这么做是很重要的. 在 Mathematica 源格式中, Mathematica 脚本通常写为扩展名为 .m 的文件.

当您交互式地使用 Mathematica 时,包含在脚本文件中的命令可以利用 Get 计算. 这个函数也可以通过编程在代码或者其它 .m 文件中使用.

Get["file"]读入一个文件,并且运行其中的命令
<<fileGet 的简写形式

从一个脚本文件读取命令.

这里对脚本文件的结构没有任何要求. 在该文件中给出的任何 Mathematica 命令序列按照顺序读入并计算. 如果您的代码比一个普通命令列表更复杂,您可能可以考虑编写一个更为结构化的程序包,如 "建立 Mathematica 程序包" 中所述.

当我们不必采用一个交互式的会话时,即您的脚本封装了需要执行的简单计算时,Mathematica 脚本就更有用了. 例如,您的计算涉及大量计算任务,如线性代数、最优化、数值积分或微分方程的解、并且当您不使用排版功能、动态交互或笔记本.

运行脚本

当从命令行调用 Mathematica 内核时,可以使用脚本文件,假定 MathKernel 或者 math 可执行文件位于路径上,并且可以找到.

$ MathKernel -script file.m

在 Mac OS X 上运行脚本文件.

$ math -script file.m

在 Linux 上运行脚本.

-script 命令行选项指定 Mathematica 内核在一个特殊的脚本上运行,或者以批处理模式运行. 在这种模式下,内核读入指定的文件,并且按顺序计算命令. 通过把输出函数的 PageWidth 选项设为 Infinity,内核关闭默认的换行功能,并且不显示 In[]Out[] 标签.

当以这种模式运行时,标准输入和输出通道, 不重定向,并且输出以 InputForm 形式表示. 因此,脚本的输出可以保存为一个文件,然后依照顺序读入 Mathematica. 对于传递给其它脚本,该输出也是合适的,因此计算脚本命令的 MathKernel 进程可以与其它进程一同用在一个管道中.

运行带有 -script 选项的 MathKernel 等价于利用 Get 命令读入文件,唯一的不同之处是:在计算文件中最后一个命令之后,内核停止运行. 这种行为可能会影响 MathLink 链接或者通过运行脚本创建的外部进程.

Unix 脚本可执行文件

Unix 类型的操作系统允许编写可以编译为可执行文件,并且作为普通可执行程序运行的脚本. 这可以通过在文件开头放上一个"解释器"行实现. 同样可以使用包含 Mathematica 命令的脚本实现.

"解释器"行包括两个字符 "#!",它必须是文件中的第一个字符,接着是到达 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 的一个符号链接. 给出符号链接的绝对路径在解释器行是可以接受的,并且它将被合理地解释.

如果要把脚本编译成可执行文件,您需要设置可执行权限. 之后,就可以通过在一个 shell 提示输入脚本名称,运行脚本.

$ 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 命令通常忽略脚本的第一行.

脚本参数

当运行一个 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 是以脚本名称为第一个元素的一个列表,列表的其余元素为命令行变量. $ScriptCommandLine 遵循标准的 argv[] 习惯.

因为类 Unix 操作系统执行脚本,$ScriptCommandLine 仅仅当 Mathematica 内核经过 MathematicaScript 机制调用时才设置为非空列表. 如果该脚本应该以批处理模式和标准 Unix 脚本模式,或者在 Unix 和 Windows 环境中运行,$ScriptCommandLine 可以用于决定脚本如何运行. 那么,$ScriptCommandLine$CommandLine 都应该用于访问命令行参数.

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