贡献者: graviton
Mathematica 有个命令行解释程序 wolframscript
,可以用来运行用 Wolfram
语言编写的脚本。
可以使用 bash
命令查看:
file -L $(which wolframscript)
wolframscript --help #查看使用帮助
wolframscript --help
的输出如下:
-v,-verbose
:在执行过程中打印附加信息。
-h,-help
:打印帮助文本。
-version
:打印 WolframScript 的版本。
-c,-code WL
:给出要执行的 Wolfram Language 代码。
-f,-file PATH
:给出要执行的包含 Wolfram 语言代码的文件。
-a,-api URL|UUID
:使用指定 URL
的 API
,或来自指定 UUID
的云或本地对象。
在 -args
之后,以 key=value
的形式提供参数。
-fun,-function WL
:使用函数,参数为使用 -args
给出的 字符串
。
并将参数解析为 -signature
给出的类型。
--,-args ARGS。。。
:与 -api
或 -function
一起使用,以提供参数。
-s,-signature TYPE。。。
:与 -function
和 -args
一起使用,为提供的参数指定解释器类型。
-charset ENCODING
:使用 ENCODING
进行输出。编码可以是 None
,用于输出原始字节,
或是 $CharacterEncodings
中的任何条目,除了 Unicode
。默认情况继承终端的 语言设置
中的值。
-format TYPE
:指定输出的格式。可以使用 Export
所理解的任何格式。
-print [all]
:当运行 脚本
时,打印脚本 最后一行
的结果。如果给了 all
参数,则打印 每一行
。
-linewise
:执行读取到的 标准输入
中的每行代码。
-script ARGS。。。
:与 wolfram -script
相对应,作用是设置 $ScriptCommandLine
。
建立后缀名为 .wl
or .wls
的文件,然后按平常写 Mathematica
笔记本的语法编写脚本。
但最好用 字符串函数
代替 Box
相关的函数,如 TableForm
。
运行时,用 wolframscript
唤起脚本(如 windows 为 wolframscript.exe
)。
假如当前目录下有脚本 test.wl
,用类似下面的方式运行:
wolframscript -script test.wl \
--Lbd-num '0.90' --Lbd-fit '0.90' --ord '\$ord0'
其中 --Lbd-num '0.90' --Lbd-fit '0.90' --ord '\$ord0'
将作为参数提供给脚本 test.wl
,可在脚本内部使用。
注意 $ScriptCommandLine
中的参数,其类型均为 String
。
也就是命令行接收到的 参数
,会被强制转码为 字符串
。
所以上面收到的参数列表为:
{"./test.wl","--Lbd-num","0.90","--Lbd-fit","0.90","--ord","$ord0"}
如果需要使用 数字
或其他类型的 值
,需要在脚本内部自行转换(ToExpression
)。
此外,如果命令行参数中包含 $
,需要用 单引号 + 反斜杠
转义(escape)。
例如 $ord
-> '\$ord0'
。
在 WolframScript
开始执行时,会预定义一些变量。
因此在脚本内部,可以从这些 预设变量
读取 shell
中提供的参数。
$CommandLine
:字符串列表
,给出运行 WolframKernel
使用的 完整命令行
。
$ScriptCommandLine
:为 正运行的脚本
准备的 命令行参数列表
。
这些参数出现在 -option
给出的选项之后。
$ScriptInputString
:代表在 标准输入
通道 上对 原始操作系统命令
的输入,
正运行的 Wolfram Language 实例即来自 此命令的调用
(invoke)
。脚本迭代一次,-linewise
选项就把 标准输入
的一行载入该变量。
可在交互式脚本中使用。
在上面的例子中,三个变量被填充如下,不同平台可能稍有不同
$CommandLine->{/usr/local/Wolfram/Mathematica/12.2/
SystemFiles/Kernel/Binaries/Linux-x86-64/WolframKernel,
-wlbanner,-script,test.wl,--,test.wl,
--Lbd-num,0.90,--Lbd-fit,0.90,--ord,$ord0}
$ScriptCommandLine->{test.wl,--Lbd-num,0.90,--Lbd-fit,0.90,--ord,ord0}
$ScriptInputString->None
也可用 wolfram
命令运行脚本,但是 wolfram
不会设置 $ScriptCommandLine
,只会填充 $CommandLine
:
wolfram -script test.wl --Lbd-num '0.90' --Lbd-fit '0.90' --ord '\$ord0'
Unix
还可以加上 Shebang
行。即在脚本文件首行添加
#!/usr/bin/env wolframscript [其他选项]
运行的时候,不需要先输入 wolframscript
,传递参数的方法和上面相同。
./test.wl para1 para2
# 或者
wolframscript -script ./init.wl &>\
~/test/log.txt & # 在后台运行,把输出重定向到日志文件 log.txt
下面是一些经常用到的 MMA 系统变量:
guide/SystemInformation
: MMA 系统信息
guide/WolframSystemSetup
: 更一般的系统设置
$InputFileName
: 脚本的绝对路径。
$Notebooks
: 如果是用前端运行的,则为 True
。
$BatchInput
: 输入是否来自批处理
$BatchOutput
: 如果在命令行中输出,则为 True
。
$CommandLine
: 唤醒环境变量所使用的命令行,
$ProcessID
: 进程 ID
$ParentProcessID
:
$Username
: 用户的登陆名
Environment["var"]
: 操作系统的环境变量,如 Environment["HOME"]