Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix 在Mathematica的后台运行程序_Unix_Wolfram Mathematica - Fatal编程技术网

Unix 在Mathematica的后台运行程序

Unix 在Mathematica的后台运行程序,unix,wolfram-mathematica,Unix,Wolfram Mathematica,有没有办法在Mathematica中创建一个后台进程,这样外部命令可以运行,但不会阻塞其他计算 startTime = AbsoluteTime[]; Run["sleep 2" (*, a magic option here perhaps? *)]; AbsoluteTime[] - startTime (* Returns 2.016960 on my system *) 我想要一个版本的/option forRun,它不会阻塞计算,这样上面代码中的最后一行将返回接近零的值 (以上内容将

有没有办法在Mathematica中创建一个后台进程,这样外部命令可以运行,但不会阻塞其他计算

startTime = AbsoluteTime[];
Run["sleep 2" (*, a magic option here perhaps? *)];
AbsoluteTime[] - startTime
(* Returns 2.016960 on my system *)
我想要一个版本的/option for
Run
,它不会阻塞计算,这样上面代码中的最后一行将返回接近零的值

(以上内容将在nix和OSX中运行;在DOS/Windows shell中似乎没有任何通用/可移植的“睡眠2”方式: 。尽管如此,获取
sleep
命令的最简单方法可能是安装MS资源工具包-请参阅下面的问题或注释。)


目前,我希望这样做的原因是,中给出的
ALSASound
命令将不会停止,但这也是对
ALSASound
的一个很好的改进,也是一个需要了解的有用信息


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

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

然后

类似的解决方案适用于我的
ALSASound
命令,我已经在Windows中执行了。

(我是否理解您正在尝试执行的操作??)

编辑


出于可移植性的原因,我认为Mma不应该假设底层操作系统的特定功能。有一个标准的输入和输出,以及一个可以从程序内部调用的命令shell就足够了。一旦你将控制权传递给你选择的操作系统外壳,你可以做任何你想做的事情(比如调用
start
或submit
&
),或者你的操作系统允许你做的事情。

正如Simon指出的那样,
开关
是程序条件的正确工具,比
分段
更合适。下面是使用
开关的相同解决方案

BackgroundProcess[proc_String] := 
  Switch[$OperatingSystem, 
    "MacOSX" | "Unix", Run["(" <> proc <> ")&"], 
    "Windows", Run["start /b " <> proc],
     _, $Failed]
BackgroundProcess[proc_String]:=
开关[$OperatingSystem,
“MacOSX”|“Unix”,运行[“(“proc”)&”],
“Windows”,运行[“启动/b”程序],
_,$Failed]

您可以编写这样的包装器函数,以便处理多个操作系统

BackgroundProcess[proc_String] := 
 Module[{
  command = Piecewise[{
       {proc <> " &", $OperatingSystem == "MacOSX" || "Unix"}, 
       {"start /b " <> proc, $OperatingSystem == "Windows"}
     }]
    }, 
  Run[command]]
BackgroundProcess[proc_String]:=
模块[{
命令=分段[{
{proc”&“,$OperatingSystem==“MacOSX”| |“Unix”},
{“启动/b”程序,$OperatingSystem==“Windows”}
}]
}, 
运行[命令]]
start
之后的
/b
在后台运行该进程,而不产生新的命令窗口,并且输出被打印到stdout。然后,如果需要,您可以在此基础上添加错误消息、一些输入清理(例如,不允许
rm
等),您应该都已设置好


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

Windows中的睡眠:@belisarius:默认情况下不存在
Sleep
命令,它需要安装资源工具包…是的。我发布了指向(空闲)MS资源的指针kit@Simon-我讨论迟到了,如果这些建议很愚蠢,请原谅我。。。(1) 你不能只用两个内核操作吗?一个用于您的主要工作,一个用于后台类型的流程?(可能是通过ScheduledTasks控制的——尽管你说你想避免这种情况)@telefunkenvf14:可能-但我更感兴趣的是运行/创建后台非mathematica进程……是和否。我认为命令
start
会产生一个新的(或者可能是子)进程。这基本上就是我在发布问题后想到的解决方案。我知道你可以看到一个删除的答案。如果有一个基于Mathematica的、独立于平台的解决方案也很好,即不依赖于在windows中使用
start
,或在*nix中使用
&
。@Simon我不评论看不见的或可耻的答案:)@Simon严肃地说。这不是你想做的吗?也许我错过了什么是的。这就是我想做的。你的答案提供了Windows解决方案,我的答案提供了*nix解决方案。是否有平台无关/基于Mathematica的解决方案?@Simon我想您不想使用
ScheduledTasks[]
。是吗?当然,我明白-这也是我想象Mma中的文件系统命令如何实现的。这基本上就是我在问题编辑部分的想法(so+1)。虽然我认为对于这种类型的函数,
哪个
开关
分段
更合适。
开关
如果没有找到匹配项,则返回未计算值,而对于
分段
,则可以有一个默认值,可能是错误消息。但我可能错了。。。在任何情况下,
哪个
切换
如果
分段
,选择:)使用
切换
,您可以使用
切换
,使用
切换
,使用
如果
,您可以选择第四个参数。我通常认为,
分段
用于数学,而其他部分用于编程/流量控制。我不想将此移动到聊天:/@Simon如果我的穷人英语允许的话,我将尝试清楚地陈述我的观点。有许多操作系统的“fork”原语根本不存在。你不应该要求Mma实现一个完整的操作系统概念
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]]