从Mathematica在后台运行程序

时间:2011-07-05 00:51:24

标签: unix wolfram-mathematica

有没有办法在Mathematica中进行后台处理,以便外部命令可以运行但不会阻止其他评估?

startTime = AbsoluteTime[];
Run["sleep 2" (*, a magic option here perhaps? *)];
AbsoluteTime[] - startTime
(* Returns 2.016960 on my system *)

我想要Run的{​​/ 1}版本,它不会阻碍评估,所以上面代码中的最后一行会返回接近零的内容。

(以上将在* nix和OSX中运行;似乎没有任何通用/可移植的方式在DOS / Windows shell中“睡眠2”: Sleeping in a batch file。虽然获得sleep命令的最简单方法可能是安装MS资源工具包,但请参阅this answer问题或以下评论。{/ p>


目前,我希望这样做的原因是Sleeping in a batch file中给出的ALSASound命令不会停止No sound in Mathematica under linux fireworks但它也会很好对ALSASound的改进以及一般有用的知识。


修改

下面发布的两个解决方案依赖于使用shell在Windows / DOS中使用start cmd和在* nix中使用cmd&来生成新/子进程。是否有基于平台的和/或基于Mathematica的解决方案? (创建使用$OperatingSystem检查操作系统的命令将获得积分!)

3 个答案:

答案 0 :(得分:4)

正如西蒙指出的那样,Switch是程序条件的正确工具,比Piecewise更合适。以下是使用Switch

的相同解决方案
BackgroundProcess[proc_String] := 
  Switch[$OperatingSystem, 
    "MacOSX" | "Unix", Run["(" <> proc <> ")&"], 
    "Windows", Run["start /b " <> proc],
     _, $Failed]

您可以编写一个类似于处理多个操作系统的包装函数。

BackgroundProcess[proc_String] := 
 Module[{
  command = Piecewise[{
       {proc <> " &", $OperatingSystem == "MacOSX" || "Unix"}, 
       {"start /b " <> proc, $OperatingSystem == "Windows"}
     }]
    }, 
  Run[command]]

/b start在后​​台运行进程,而不会生成新的命令窗口,输出将打印到stdout。然后,您可以在此基础上构建错误消息,一些输入清理(例如,不允许rm等),如果您需要,并且您应该全部设置。

Mathematica的预定义函数(如果它存在)可能会沿着这些线。后台进程固有地依赖于操作系统,因此没有真正的“平台独立”方式。声称是这样的任何实现(如python中的os模块)基本上是为已知存在的每个可能的操作系统定义的一组规则,因此您不必担心更精细的细节。

答案 1 :(得分:1)

在Windows中(我明白你要做什么吗?)

startTime = AbsoluteTime[];
Run["start notepad"];
AbsoluteTime[] - startTime
(*
-> 0.1406250
*)

修改

出于可移植性的原因,我不认为Mma应该承担底层操作系统的特定功能。拥有标准输入和输出,以及从程序内部调用的命令shell就足够了。一旦您将控制权传递给您选择的操作系统外壳,请执行您想要的任何操作(例如,调用start或提交&)或操作系统允许您执行的操作。

答案 2 :(得分:0)

虽然我不知道Mathematica这样做的方法,但有一个非常简单的BASH / shell解决方案:只需使用“&”创建一个子进程“.

然后

startTime = AbsoluteTime[];
Run["(sleep 20)&"];
AbsoluteTime[] - startTime
(* Returns approx 0.01 *)

类似的解决方案适用于我的ALSASound命令,我updated my answer