2.11.2 外部程序在大部分计算机系统中可以在 Mathematica 中执行外部程序或命令. 经常需要把 Mathematica 中产生的表达式送入外部程序,或将外部 程序的结果读入 Mathematica. Mathematica 支持与外部程序通讯的两种基本形式:有结构的和非结构化的. Mathematica 与外部程序通讯的两种类型 结构化通讯的思想是将完整的 Mathematica 表达式转换为外部程序. 处理这些对象的结构化通讯的基础是 2.12 节中讨论的 MathLink 系统. 非结构化通讯就是向外部程序发送或从外部程序接收常用文本. 其基本思想 是将外部程序当作文件去处理,并且支持相同的同样的读写操作. 外部程序的读写 在使用普通文件名时,Mathematica 用!给出外部命令管道. 使用 这个管道时,Mathematica 就执行该外部命令,并由此发送或接收文本. 这里将从 FactorInteger 得到的结果发送到外部程序 lpr. 在许多 Unix 系统中,这个程序产生一个打印输出 这里执行外部程序 echo $TERM,然后将这个结果作为 Mathematica 的输入
Out[2]= |  |
要注意的一点是有可能丢掉 << 或 >> 右端管道名两边的双引号, 如果这个名称中没有空格或其它特殊符号时,该错误可能会侥幸不被发现. Mathematica 中的管道为和外部程序的非结构化通讯提供了非常一般的机制. 在许多计算机系统中,Mathematica 中非结构化通讯的一个限制是给出的管道 仅能用于输入或输出,而不是同时对它们两者. 为了进行双向通讯,必须用 MathLink. 即使对非结构化通讯,也可以用临时文件进行更复杂的安排,其基本思想是将数据 写入一个文件,然后按需要读取它. 打开一个临时文件 在使用临时文件时,不明确地向 Mathematica 发送或从 Mathematica 接收数据能够执行外部命令是有用的. 这可以用函数 Run 来实现. 无输入输出地执行外部命令 执行外部 Unix 命令 data. 返回值是操作系统的退出代码
Out[3]= |  |
在使用 Run 时要注意不能用有!的命令. Run 简单地取出所指定变量的文本形式, 用空格将它们连接在一起,将所得字符串结果按外部命令去执行. 重要的一点是要知道 Run 不 "捕获" 从外部命令所产生的输出,这个输出的去向完全 由所用的操作系统确定. 同样 Run 也不向外部命令提供输出,这意味着该命令 从所用操作系统的机理得到输入. 有时外部命令也可以访问 Mathematica 本身使用的输入, 输出流. 这在有些情况中是期望的. 但在前端中使用 Mathematica 时,这可能引起很多麻烦. Mathematica 中的外壳逃逸 在文本界面中使用 Mathematica 时,通常有一个执行外部命令的特殊机理, Mathematica 选取任何用!开始的输入行,将这行的内容按外部命令执行. Mathematica 使用 ! 命令的方式是一个典型的在 Unix 操作系统中所运行程序的 外层逃逸,在 Mathematica 的许多版本中,可以通过简单地在一行输入 一个 ! 从 Mathematica 去起动一个交互式的外壳. 这一行用作外壳逃逸去执行 Unix 命令 data
Out[4]= |  |
通过外部程序运行 Mathematica 表达式 在前面讨论过的 << 或 >> 不能用来同时向外部程序发送和接收数据. 但使用临时文件后,在非结构化通讯中可以有效地向外部程序发送 或接收数据. 函数 RunThrough 将表达式的文本写入一个临时文件,然后将这个文件作为外部程序的输入, 并且捕获输出作为 Mathematica 的输入. 注意在 RunThrough 中与 Run 相同, 不能在外部命令前用!. 这里将表达式 789 作为外部程序 cat 的输入,该程序仅简单地响应该表达式的内容. cat 的输出则被读入 Mathematica
Out[5]= |  |
|