有没有办法在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
检查操作系统的命令将获得积分!)
答案 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。