【问题标题】:Call a Mathematica program from the command line, with command-line args, stdin, stdout, and stderr从命令行调用 Mathematica 程序,使用命令行参数、标准输入、标准输出和标准错误
【发布时间】:2010-09-13 23:11:39
【问题描述】:

如果您在 foo.m 中有 Mathematica 代码,则可以使用 -noprompt 调用 Mathematica 和-initfile foo.m (或-run "<<foo.m") 并且命令行参数在$CommandLine 中可用(其中有额外的垃圾),但是有没有办法只使用一些数学代码,如

#!/usr/bin/env MathKernel
x = 2+2;
Print[x];
Print["There were ", Length[ARGV], " args passed in on the command line."];
linesFromStdin = readList[];
etc.

chmod 可执行并运行它?换句话说,如何像使用任何其他脚本语言(Perl、Python、Ruby 等)一样使用 Mathematica?

【问题讨论】:

    标签: command-line scripting wolfram-mathematica


    【解决方案1】:

    MASH -- Mathematica Scripting Hack -- 会做到这一点。

    从 Mathematica 版本 6 开始,以下 perl 脚本就足够了:

    http://ai.eecs.umich.edu/people/dreeves/mash/mash.pl

    对于以前的 Mathematica 版本,需要一个 C 程序:

    http://ai.eecs.umich.edu/people/dreeves/mash/pre6

    更新:终于,Mathematica 8 通过“-script”命令行选项原生支持这一点:

    http://www.wolfram.com/mathematica/new-in-8/mathematica-shell-scripts/

    【讨论】:

      【解决方案2】:

      这是一个不需要额外帮助脚本的解决方案。您可以使用以下 shebang 直接调用 Mathematica 内核:

      #!/bin/sh
      exec <"$0" || exit; read; read; exec /usr/local/bin/math -noprompt "$@" | sed '/^$/d'; exit
      (* Mathematica code starts here *)
      x = 2+2;
      Print[x];
      

      shebang 代码跳过脚本的前两行,并将其余部分作为标准输入提供给 Mathematica 内核。 sed 命令删除内核产生的空行。

      此 hack 不如 MASH 通用。因为 Mathematica 代码是从 stdin 读取的,所以您不能使用 stdin 进行用户输入,即函数 InputInputString 不起作用。

      【讨论】:

        【解决方案3】:

        假设您将 Mathematica 二进制文件添加到 ~/.profile 中的 PATH 环境变量中,

        export PATH=$PATH:/Applications/Mathematica.app/Contents/MacOS
        

        然后您只需在 Mathematica 脚本中编写此 shebang 行。

        #!/usr/bin/env MathKernel -script
        

        现在您可以在脚本中添加点斜线。

        $ cat hello.ma
        #!/usr/bin/env MathKernel -script
        
        Print["Hello World!"]
        
        $ chmod a+x hello.ma
        $ ./hello.ma
        "Hello World!"
        

        使用 Mathematica 8.0 测试。

        小错误:Mathematica 在 Windows 和 Mac OS X 中用引号包围 Print[s],但在 Linux 中没有。什么鬼?

        【讨论】:

          【解决方案4】:

          试试
          -initfile 文件名
          并将退出命令放入您的程序中

          【讨论】:

          • 谢谢,这是对运行的改进。我更新了问题。我有一个我认为更完整的解决方案,我很快就会发布。
          • 在我的 mash.pl 解决方案中,事实证明您必须使用 -run,而不是 -initfile。我不知道为什么,但后者会导致从文件读取的数学脚本出现问题。
          【解决方案5】:

          我找到了另一个适合我的解决方案。

          将代码保存在 .m 文件中,然后像这样运行它: MathKernel -noprompt -run “

          这是链接:http://bergmanlab.smith.man.ac.uk/?p=38

          【讨论】:

            【解决方案6】:

            对于数学 7

            $ cat test.m
            #!/bin/bash
            MathKernel -noprompt -run < <( cat $0| sed -e '1,4d' )  | sed '1d'
            exit 0
            ### code start Here ... ###
            Print["Hello World!"]
            X=7
            X*5
            

            用法:

            $ chmod +x test.m
            
            $ ./test.m
            "Hello World!"
            
            7
            35
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-02
              • 2020-05-26
              • 1970-01-01
              • 2011-12-13
              • 2021-04-29
              • 2021-06-24
              相关资源
              最近更新 更多