外部程序
在大部分计算机系统中,可以在
Mathematica 中执行外部程序或命令. 经常需要把
Mathematica 中产生的表达式送入外部程序,或将外部程序的结果读入
Mathematica.
Mathematica 支持与外部程序通讯的两种基本形式:
有结构的 和
非结构化的.
| 结构化通讯 | 用 MathLink 将表达式转换为与 MathLink 相容的外部程序 |
| 非结构化通讯 | 用文件读写操作转换通常的文本 |
Mathematica 与外部程序通讯的两种类型.
结构化通讯的思想是将完整的
Mathematica 表达式转换为外部程序. 处理这些对象的结构化通讯的基础是在
"MathLink 和外部程序的通讯" 中讨论的
MathLink 系统.
非结构化通讯就是向外部程序发送或从外部程序接受常用文本. 其基本思想是将外部程序当作文件去处理,并且支持相同的读写操作.
| <<file | 读入文件 |
| <<"!command" | 运行外部命令,并读入其产生的输出 |
| expr>>"!command" | 把 expr 的文本形式作为外部命令的输入 |
| ReadList["!command",Number] | 运行外部命令,并读入其产生的数字列表 |
与外部程序通讯的一些方法.
一般情况下,在使用普通文件名时,
Mathematica 用! 给出管道,并以外部命令的方式写出. 使用这个管道时,
Mathematica 就执行该外部命令,并由此发送或接收文本.
这里执行外部程序

,然后将这个结果作为
Mathematica 的输入.
| Out[2]= |  |
使用基于文本的界面,把

放在一行的起始处会使该行的其余部分作为外部命令执行.

是一个打印数字及其平方的外部程序.
In[1]:= !squares 4
1 1
2 4
3 9
4 16
这里运行外部命令

,然后从产生的输出读入数据.
| Out[3]= |  |
要注意的一点是有可能丢掉

或

右端管道名两边的双引号,如果这个名称中没有空格或其它特殊符号时,该错误可能会侥幸不被发现.
Mathematica 中的管道为和外部程序的非结构化通讯提供了非常一般的机制. 在许多计算机系统中,
Mathematica 管道使用操作系统中管道机制实现;然而,在一些情况中,则使用其它进程间的通讯机制.
Mathematica 中非结构化通讯的一个限制是给出的管道仅能用于输入或输出,而不是同时用于它们两者. 为了进行双向通讯,必须用
MathLink.
即使对非结构化通讯,也可以用"临时文件"进行更复杂的安排. 其基本思想是将数据写入一个文件,然后按需要读取它.
打开一个"临时文件".
尤其在使用临时文件时,不明确地向
Mathematica 发送或从
Mathematica 接收数据能够执行外部命令是有用的. 这可以用
Mathematica 函数
Run 来实现.
| Run["command",arg1,...] | 在 Mathematica 中执行外部命令 |
无输入输出地执行外部命令.
执行外部 UNIX 命令

. 返回值是操作系统的退出代码.
| Out[4]= |  |
在使用
Run 时要注意不能用有! 的命令.
Run 简单地取出所指定变量的文本形式,用空格将它们连接在一起,将所得字符串结果按外部命令去执行.
重要的一点是要知道
Run 不"捕获"从外部命令所产生的输出. 结果,这个输出的去向完全由所用的操作系统确定. 同样,
Run 也不向外部命令提供输出,这意味着该命令从所用的操作系统的机理得到输入. 有时,外部命令也可以访问
Mathematica 本身使用的输入、输出流. 这在有些情况中是期望的. 但在前端中使用
Mathematica 时,这可能引起很大麻烦.
| RunThrough["command",expr] | 运行 command,将 expr 作为输入,并将输出读入 Mathematica |
通过外部程序运行 Mathematica 表达式.
在前面讨论过的

和

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

作为外部程序

的输入,该程序仅简单地响应该表达式的内容.

的输出则被读入
Mathematica.
| Out[5]= |  |
| SystemOpen["target"] | 使用在计算机系统中相关联的程序打开指定的文件、URL或其它目标 |
使用外部程序打开文件.
SystemOpen 使用操作系统中的设置来决定如何打开一个URL或文件. 当打开文件时,如果双击文件的按钮,通常会运用所使用过的同样的程序.