Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 在Mathematica中运行外部命令时非常奇怪的行为_Wolfram Mathematica - Fatal编程技术网

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

Wolfram mathematica 在Mathematica中运行外部命令时非常奇怪的行为,wolfram-mathematica,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/Vers

为什么

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"]
也不是

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

有你问题的答案。然而,我的观点仍然是mathematica调用的shell实例没有正确设置path变量。以下是我的一些信息:

shell是正确的,但路径是默认路径。因此,编写修改后的路径的源代码,然后调用
python--version

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

Import["!python --version 2>&1", "Text"]
前端与命令行不同?

当在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]=
请注意,
Out[1]
为空。版本字符串出现在转录本中,但这是因为标准错误流显示在终端窗口中,与Mathematica的标准输出相互交错。如果我们将结果分配给一个变量,并(尝试)使用
抑制输出,这一点就更加清楚了

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

In[3]:= v

Out[3]=

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

尝试使用完整路径。我认为它不是一个不同的shell<代码>导入[“!echo$SHELL”,“Text”]
为我报告正确的SHELL。好的,我不知道原因。然而,这不是系统路径。我得到了相同的行为(在Ubuntu 10.10中),我只安装了一个Python版本:
Import[“!哪个Python”,“Text”
在笔记本和Mma外壳中产生
Python2.6.6
。但是
Import[“!/usr/bin/python--version”,“Text”]
在shell中生成
python 2.6.6
,而在前端没有任何内容。@Simon哦,我明白你的意思了。。。仅当您运行
math
命令时,它才起作用。您只看到
stderr
输出与
math
输出交织在一起。返回值为空,就像前端一样。@phantomas1234我没有看到这种行为。如果我执行
p=Import[“!python--version”,“Text”];p
p
被分配一个空字符串。我确实看到终端窗口中显示的
stderr
的内容,但它既没有返回到Mathematica,也没有存储到
p
中。这就是发生在你身上的事吗?@非常感谢你揭开了
2>&1
的神秘面纱!它记录在哪里(至少对于Windows)?@Alexy:在unix系统上,
是命令,
2
表示标准错误,
1
表示标准输出。因此
2>&1
将标准错误重定向到标准输出。语法在非POSIX shell上类似,如。你也可以将它重定向到不同的文件,就像我在这个答案的第一条评论中所做的那样。但是,不清楚为什么python会将其发送到标准错误,而我机器上几乎所有其他程序都会将其发送到标准输出。@Mr.Wizard“
&
”在Windows下是一个句柄重定向操作符,如前所述(感谢链接!)。这不是我,但可能是因为它似乎无法解决问题。谢谢,但弗劳奇的回答得到了承认。正如我的回答中所示,它仍然不会给OP提供他想要的版本信息,因为mma shell实例的路径错误,OP需要手动设置。不管怎么说,没什么害处,我只是给了你+1。现在感觉好些了吗?:)@巫师先生:谢谢:)我只是想知道他们的推理。通常当我获得否决票时,我知道这是我应得的;)
In[2]:= v=Import["!python --version","Text"];
Python 2.6.4

In[3]:= v

Out[3]=