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

时间:2011-05-29 22:55:18

标签: wolfram-mathematica

为什么

Import["!python --version", "Text"]

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

外壳:

"Python 2.7.1 -- EPD 7.0-2 (64-bit)"

前端:

""

更新

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

Import["!which python", "Text"]

产量

"/usr/bin/python"

在前端和

"/Library/Frameworks/EPD64.framework/Versions/Current/bin/python"
shell中的

(这是我在我的系统上安装的另一个python版本)。尽管如此,

Import["!/usr/bin/python --version", "Text"]

,也不

Import[
"!/Library/Frameworks/EPD64.framework/Versions/Current/bin/python --version",
"Text"]

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

2 个答案:

答案 0 :(得分:10)

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

来实现
Import["!python --version 2>&1", "Text"]

前端与命令行不同?

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

$ 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]=

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

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

In[3]:= v

Out[3]=

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

答案 1 :(得分:3)

WReach可以解答您的问题。但是,我的观点仍然是mathematica调用的shell实例没有正确设置路径变量。以下是我的一些信息:

enter image description here

shell是正确的,但路径是默认路径。因此,请获取我修改后的路径,然后调用python --version

enter image description here