GetHelpBrowserLocationMetaTag Rest LinkTrail Tags First Null
此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.1)
 /

2.11.2 外部程序

在大部分计算机系统中可以在 Mathematica 中执行外部程序或命令. 经常需要把 Mathematica 中产生的表达式送入外部程序,或将外部 程序的结果读入 Mathematica.
Mathematica 支持与外部程序通讯的两种基本形式:有结构的和非结构化的.

Mathematica 与外部程序通讯的两种类型

结构化通讯的思想是将完整的 Mathematica 表达式转换为外部程序. 处理这些对象的结构化通讯的基础是 2.12 节中讨论的 MathLink 系统.
非结构化通讯就是向外部程序发送或从外部程序接收常用文本. 其基本思想 是将外部程序当作文件去处理,并且支持相同的同样的读写操作.

外部程序的读写

在使用普通文件名时,Mathematica 用!给出外部命令管道. 使用 这个管道时,Mathematica 就执行该外部命令,并由此发送或接收文本.

这里将从 FactorInteger 得到的结果发送到外部程序 lpr. 在许多 Unix 系统中,这个程序产生一个打印输出

这里执行外部程序 echo $TERM,然后将这个结果作为 Mathematica 的输入

要注意的一点是有可能丢掉 <<>> 右端管道名两边的双引号, 如果这个名称中没有空格或其它特殊符号时,该错误可能会侥幸不被发现.
Mathematica 中的管道为和外部程序的非结构化通讯提供了非常一般的机制. 在许多计算机系统中,Mathematica 中非结构化通讯的一个限制是给出的管道 仅能用于输入或输出,而不是同时对它们两者. 为了进行双向通讯,必须用 MathLink.
即使对非结构化通讯,也可以用临时文件进行更复杂的安排,其基本思想是将数据 写入一个文件,然后按需要读取它.

打开一个临时文件

在使用临时文件时,不明确地向 Mathematica 发送或从 Mathematica 接收数据能够执行外部命令是有用的. 这可以用函数 Run 来实现.

无输入输出地执行外部命令

执行外部 Unix 命令 data. 返回值是操作系统的退出代码

在使用 Run 时要注意不能用有!的命令. Run 简单地取出所指定变量的文本形式, 用空格将它们连接在一起,将所得字符串结果按外部命令去执行.
重要的一点是要知道 Run 不 "捕获" 从外部命令所产生的输出,这个输出的去向完全 由所用的操作系统确定. 同样 Run 也不向外部命令提供输出,这意味着该命令 从所用操作系统的机理得到输入. 有时外部命令也可以访问 Mathematica 本身使用的输入, 输出流. 这在有些情况中是期望的. 但在前端中使用 Mathematica 时,这可能引起很多麻烦.

Mathematica 中的外壳逃逸

在文本界面中使用 Mathematica 时,通常有一个执行外部命令的特殊机理, Mathematica 选取任何用!开始的输入行,将这行的内容按外部命令执行.
Mathematica 使用 ! 命令的方式是一个典型的在 Unix 操作系统中所运行程序的 外层逃逸,在 Mathematica 的许多版本中,可以通过简单地在一行输入 一个 ! 从 Mathematica 去起动一个交互式的外壳.

这一行用作外壳逃逸去执行 Unix 命令 data

通过外部程序运行 Mathematica 表达式

在前面讨论过的 <<>> 不能用来同时向外部程序发送和接收数据. 但使用临时文件后,在非结构化通讯中可以有效地向外部程序发送 或接收数据.
函数 RunThrough 将表达式的文本写入一个临时文件,然后将这个文件作为外部程序的输入, 并且捕获输出作为 Mathematica 的输入. 注意在 RunThrough 中与 Run 相同, 不能在外部命令前用!.

这里将表达式 789 作为外部程序 cat 的输入,该程序仅简单地响应该表达式的内容. cat 的输出则被读入 Mathematica