1

在 Windows 中,您可以在 Matlab 中使用以下命令来启动一个新的 MATLAB 实例,该实例将在后台运行(即,您可以在您的第一个 MATLAB 版本中继续执行命令)。

系统('matlab &')

OSX 中的类似调用,

系统([matlabroot '/bin/matlab &'])

但是会导致显示初始图像,然后什么也没有。如果我取出 & 符号,新实例将按预期打开。不幸的是,这对我不起作用,我真的需要能够在第二个运行时控制 MATLAB 的第一个实例。

有谁知道为什么操作系统之间存在这种差异?顺便说一句,我在 Mac 上使用 OSX 10.7、Windows 7 64 位和 MATLAB R2012a,在 PC 上使用 R2012b。

作为一些背景,我正在尝试为广泛使用 input() 函数的交互式命令行界面编写一个通用测试器。

编辑:我应该提到该命令

/Applications/MATLAB_R2012a.app/bin/matlab &

从 OSX 终端按预期工作。换句话说,一个新的 MATLAB 实例打开并且可以在终端中输入新的命令。所以这个问题似乎特定于 OSX matlab 中的 system() 函数。

此外,我尝试将该命令添加到 bash 脚本并从 matlab 调用该脚本,但遇到了与将命令放入 system() 函数时相同的问题。

谢谢

4

2 回答 2

0

您可以使用 applescript 来执行此操作。我做这样的事情:

! osascript -e "tell application \"Terminal\" to do script \"cd `pwd`;matlab -nojvm -nosplash -r 'why'\""

此示例在当前目录中打开一个新的 Matlab 实例,并运行命令“why”。如果您在后台 Matlab 进程中需要 java,您可以删除“-nojvm”

于 2013-07-16T07:18:36.053 回答
0

system()这是一个长镜头,但它可能会发生,因为当您在 Unix 或 OS X 上使用命令从 Matlab 调用 Matlab 的新实例时,该matlab_helper进程分叉并运行一个 shell 进程来运行新应用程序。如果省略 & 符号,shell 会阻塞并等待程序完成,然后system()等待它,因此第一个 Matlab 锁定。并且(这里是推测部分)如果您添加与号,Matlab 在后台启动,然后分叉的 shell 退出,这会导致新的 Matlab 进程退出,因为它的父进程(shell)已经退出。(Windows 没有相同的父/子进程关系、进程启动机制或 shell,这可以解释不同的行为。)

您可以尝试在命令前加上nohup,这可以防止进程被 SIGHUP 杀死,这可能是您的第二个 Matlab 进程发生的情况。

system(['nohup ' matlabroot '/bin/matlab &'])

您也可以尝试使用 OS Xopen命令来启动一个新的独立实例。像这样的东西。您可能需要摆弄选项和路径,但-n应该是为您提供新实例的原因。它应该指向/Applications/MATLAB_R2012a.app; 我假设这matlabroot就是 OS X 上返回的内容。

system(['open -na ' matlabroot])

您也可以尝试从 Matlab 中的 Java 进程启动功能运行它,而不是使用system(). Runtime.exec()不会像system()那样阻塞,并且可能还有其他怪癖system(),例如matlab_helper架构。尝试java.lang.Runtime从 Matlab 启动它。

jrt = java.lang.Runtime.getRuntime();
newMatlabProcess = jrt.exec([matlabroot '/bin/matlab']);

您也可以使用此机制尝试上面的其他命令行变体,并且您可能需要将 stdout 重定向到 /dev/null,因为新进程的输入和输出被缓冲到该newMatlabProcess对象中。

于 2013-03-24T17:18:55.760 回答