在Mathematica中运行外部命令时非常奇怪的行为

pha*_*234 8 wolfram-mathematica

为什么

Import["!python --version", "Text"]
Run Code Online (Sandbox Code Playgroud)

在命令行上工作但不在Mathematica 8(在Mac上运行)的前端工作?

贝壳:

"Python 2.7.1 -- EPD 7.0-2 (64-bit)"
Run Code Online (Sandbox Code Playgroud)

前端:

""
Run Code Online (Sandbox Code Playgroud)

更新:

好的,路径不是(真的)问题,因为

Import["!which python", "Text"]
Run Code Online (Sandbox Code Playgroud)

产量

"/usr/bin/python"
Run Code Online (Sandbox Code Playgroud)

在前端和

"/Library/Frameworks/EPD64.framework/Versions/Current/bin/python"
Run Code Online (Sandbox Code Playgroud)

在shell中(这是我在我的系统上安装的不同的python版本).尽管如此

Import["!/usr/bin/python --version", "Text"]
Run Code Online (Sandbox Code Playgroud)

也不

Import[
"!/Library/Frameworks/EPD64.framework/Versions/Current/bin/python --version",
"Text"]
Run Code Online (Sandbox Code Playgroud)

在前端产生正确的输出.但是在前端和终端版本中使用不同的shell可能会暗示为什么Mathematica行为不端.

WRe*_*ach 10

python --version将其响应写入标准错误流,但Import仅捕获标准输出流.要查看响应,请将stderr重定向到stdout.在大多数shell(甚至Windows)中,这可以使用魔术咒语来实现2>&1:

Import["!python --version 2>&1", "Text"]
Run Code Online (Sandbox Code Playgroud)

前端与命令行不同?

在Mathematica的命令行版本中运行时,该Import命令似乎功能不同,但外观可能是欺骗性的.这是一个成绩单:

$ math
Mathematica 8.0 for Microsoft Windows (64-bit)
Copyright 1988-2011 Wolfram Research, Inc.

In[1]:= Import["!python --version","Text"]
Python 2.6.4

Out[1]=
Run Code Online (Sandbox Code Playgroud)

请注意,这Out[1]是空白的.版本字符串出现在脚本中,但这是因为标准错误流正在终端窗口中显示,散布着Mathematica的标准输出.如果我们将结果分配给变量并且(尝试)使用;以下方法抑制输出,则更加清楚:

In[2]:= v=Import["!python --version","Text"];
Python 2.6.4

In[3]:= v

Out[3]=
Run Code Online (Sandbox Code Playgroud)

应该没有任何输出,但我们仍然看到终端窗口中显示的标准错误流. v为空,表示Import表达式的值也是空白的.

  • @Alexy:在unix系统上,`>`是[重定向](http://en.wikipedia.org/wiki/Redirection_(计算))命令,`2`表示标准错误,`1`表示标准输出.所以`2>&1`将标准错误重定向到标准输出.在[Windows](http://technet.microsoft.com/en-us/library/bb490982.aspx)等非POSIX shell上的语法类似.你也可以将它重定向到不同的文件,就像我在这个答案的第一个评论中所做的那样.但是,当我的机器上几乎所有其他程序将它发送到标准输出时,不清楚为什么python将它发送到标准错误. (3认同)
  • @Simon哦,我明白你的意思了......只有当你运行`math`命令时它才会起作用.你只是看到`stderr`输出穿插了`math`输出.返回值为空,就像在前端一样. (2认同)