外部程序

在大部分计算机系统中,可以在 Wolfram 语言中执行外部程序或命令. 经常需要把 Wolfram 语言中产生的表达式送入外部程序,或将外部程序的结果读入 Wolfram 语言.

Wolfram 语言支持与外部程序通讯的两种基本形式: 有结构的非结构化的.

结构化通讯用 WSTP 将表达式转换为与 WSTP 相容的外部程序
非结构化通讯用文件读写操作转换通常的文本

Wolfram 语言与外部程序通讯的两种类型.

结构化通讯的思想是将完整的 Wolfram 语言表达式转换为外部程序. 处理这些对象的结构化通讯的基础是在 "WSTP and External Program Communication" 中讨论的 Wolfram Symbolic Transfer Protocol (WSTP) .

非结构化通讯就是向外部程序发送或从外部程序接受常用文本. 其基本思想是将外部程序当作文件去处理,并且支持相同的读写操作.

<<file读入文件
<<"!command"运行外部命令,并读入其产生的输出
expr>>"!command"expr 的文本形式作为外部命令的输入
ReadList["!command",Number]运行外部命令,并读入其产生的数字列表

与外部程序通讯的一些方法.

一般情况下,在使用普通文件名时,Wolfram 语言用! 给出管道,并以外部命令的方式写出. 使用这个管道时,Wolfram 语言就执行该外部命令,并由此发送或接收文本.

这里将从 FactorInteger 得到的结果发送到外部程序 . 在许多Unix系统中,这个程序产生一个打印输出.
In[1]:=
Click for copyable input
这里执行外部程序 ,然后将这个结果作为 Wolfram 语言的输入.
In[2]:=
Click for copyable input
Out[2]=
使用基于文本的界面,把 放在一行的起始处会使该行的其余部分作为外部命令执行. 是一个打印数字及其平方的外部程序.
In[1]:= !squares 4

1 1
2 4
3 9
4 16
这里运行外部命令 ,然后从产生的输出读入数据.
In[3]:=
Click for copyable input
Out[3]=

要注意的一点是有可能丢掉 右端管道名两边的双引号,如果这个名称中没有空格或其它特殊符号时,该错误可能会侥幸不被发现.

Wolfram 语言中的管道为和外部程序的非结构化通讯提供了非常一般的机制. 在许多计算机系统中,Wolfram 语言管道使用操作系统中管道机制实现;然而,在一些情况中,则使用其它进程间的通讯机制. Wolfram 语言中非结构化通讯的一个限制是给出的管道仅能用于输入或输出,而不是同时用于它们两者. 为了进行双向通讯,必须用 WSTP.

即使对非结构化通讯,也可以用临时文件进行更复杂的安排. 其基本思想是将数据写入一个文件,然后按需要读取它.

OpenWrite[]打开一个在计算机系统中默认区域中的具有唯一名称的临时文件

打开一个临时文件.

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

Run["command",arg1,]在 Wolfram 语言中执行外部命令

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

执行外部 UNIX 命令 . 返回值是操作系统的退出代码.
In[4]:=
Click for copyable input
Out[4]=

在使用 Run 时要注意不能用有! 的命令. Run 简单地取出所指定变量的文本形式,用空格将它们连接在一起,将所得字符串结果按外部命令去执行.

重要的一点是要知道 Run捕获从外部命令所产生的输出. 结果,这个输出的去向完全由所用的操作系统确定. 同样,Run 也不向外部命令提供输出,这意味着该命令从所用的操作系统的机理得到输入. 有时,外部命令也可以访问 Wolfram 语言本身使用的输入、输出流. 这在有些情况中是期望的. 但在前端中使用 Wolfram 语言时,这可能引起很大麻烦.

RunThrough["command",expr]运行 command,将 expr 作为输入,并将输出读入 Wolfram 语言

通过外部程序运行 Wolfram 语言表达式.

在前面讨论过的 不能用来同时向外部程序发送和接收数据. 但使用临时文件后,在非结构化通讯中可以有效地向外部程序发送或接收数据.

函数 RunThrough 将表达式的文本写入一个临时文件,然后将这个文件作为外部程序的输入,并且捕获输出作为 Wolfram 语言的输入. 注意,在RunThrough 中与 Run 相同,不能在外部命令前用!.

这里将表达式 作为外部程序 的输入,该程序仅简单地响应该表达式的内容. 的输出则被读入 Wolfram 语言.
In[5]:=
Click for copyable input
Out[5]=
SystemOpen["target"]使用在计算机系统中相关联的程序打开指定的文件、URL或其它目标

使用外部程序打开文件.

这里使用系统中首选的网络浏览器打开URL.
In[6]:=
Click for copyable input

SystemOpen 使用操作系统中的设置来决定如何打开一个URL或文件. 当打开文件时,如果双击文件的按钮,通常会运用所使用过的同样的程序.