如何在python中获得matlab脚本的输出

如何在python中获得matlab脚本的输出,python,matlab,subprocess,Python,Matlab,Subprocess,我正在通过python执行matlab计算。为此,我使用以下命令: retcode=subprocess.call["matlab","-nosplash","nodesktop","-wait","-r","run('matlabscript.m')","quit;"]) 通过在python中运行此命令行,将打开一个matlab会话,我可以开始执行前面提到的脚本'matlabscript.m'。有没有办法将这个脚本的执行结果转换成python?retcode,不包含任何内容,除非包含单个数字

我正在通过python执行matlab计算。为此,我使用以下命令:

retcode=subprocess.call["matlab","-nosplash","nodesktop","-wait","-r","run('matlabscript.m')","quit;"])

通过在python中运行此命令行,将打开一个matlab会话,我可以开始执行前面提到的脚本
'matlabscript.m'
。有没有办法将这个脚本的执行结果转换成python?retcode,不包含任何内容,除非包含单个数字。我尝试改用subprocess.check_输出,但什么也得不到。基本上,当我执行上述sript时,将创建并指定一个casename。

您可以使用
子流程。检查将等待结果的\u output

subprocess.check_output(["matlab","-nosplash","nodesktop","-wait","-r","run('matlabscript.m')","quit;"])

我建议您使用
Popen
。我没有matlab,因此无法测试您的确切命令,但请尝试以下方法:

import subprocess

cmd = ["matlab", "-nosplash", "no desktop", "-wait", "r", "run('matlabscript.m')","quit;"]

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(output, error) = proc.communicate()

if error:
    print "error:", error

print "output:", output

# if you need this:
retcode = proc.returncode
如果产生了大量的输出,那么这可能会崩溃,这是一个只有你才能做出的判断


请注意,
subprocess.communicate()
也用于
stdin

如果您使用的是Matlab>=R2014b,您只需使用Mathworks提供的

>>> import matlab.engine
>>> worker = matlab.engine.start_matlab()
>>> a = worker.eval('rand(10,10)')
>>> print(a)
[[0.8147236863931789,0.15761308167754828,0.6557406991565868,0.7060460880196088,0.43874435965639824,0.27602507699857837,0.7512670593056529,0.8407172559836625,0.35165950706299676,0.07585428956306361],[0.9057919370756192,0.9705927817606157,0.035711678574189554,0.031832846377420676,0.3815584570930084,0.6797026768536748,0.2550951154592691,0.25428217897153105,0.8308286278962909,0.05395011866660715],[0.12698681629350606,0.9571669482429456,0.8491293058687771,0.27692298496088996,0.7655167881490024,0.6550980039738407,0.5059570516651424,0.8142848260688164,0.5852640911527243,0.5307975530089727],[0.9133758561390194,0.4853756487228412,0.9339932477575505,0.04617139063115394,0.7951999011370632,0.16261173519463057,0.699076722656686,0.2435249687249893,0.5497236082911395,0.7791672301020112],[0.6323592462254095,0.8002804688888001,0.6787351548577735,0.09713178123584754,0.1868726045543786,0.11899768155837664,0.8909032525357985,0.9292636231872278,0.91719366382981,0.934010684229183],[0.09754040499940952,0.14188633862721534,0.7577401305783334,0.8234578283272926,0.48976439578823106,0.49836405198214295,0.9592914252054443,0.34998376598480874,0.28583901882037355,0.12990620847373013],[0.2784982188670484,0.421761282626275,0.7431324681249162,0.694828622975817,0.4455862007108995,0.9597439585160811,0.5472155299638031,0.19659525043120818,0.7572002291107213,0.5688236608721927],[0.5468815192049838,0.9157355251890671,0.39222701953416816,0.31709948006086053,0.6463130101112646,0.3403857266661332,0.13862444282867914,0.25108385797603106,0.7537290942784953,0.4693906410582058],[0.9575068354342976,0.7922073295595544,0.6554778901775566,0.9502220488383549,0.7093648308580726,0.5852677509797773,0.14929400555905747,0.6160446761466392,0.38044584697535666,0.011902069501241397],[0.9648885351992765,0.959492426392903,0.17118668781156177,0.03444608050290876,0.7546866819823609,0.22381193949113698,0.25750825412373646,0.47328884890272926,0.5678216407252211,0.3371226443988815]]

另一种选择是,切换到GNU倍频程并简单使用。

您是否用
stdout=subprocess.PIPE
通信方法尝试过
subprocess.Popen
。@cdarke答案放在答案框中。@AaronHall:这不是一个答案,因为问题特别需要
subprocess.call
,not
Popen
@cdarke读取源代码,同样的事情:我认为通信方法是当您希望插入命令序列以指定matlab脚本何时运行时。你确定这个命令的用法吗?我同意这是朝着正确方向迈出的一步。但显然“我尝试使用subprocess.check_输出,但我什么也得不到”,所以还有其他事情在进行。我可能需要澄清,我需要的输出是matlab的cmd中输出或键入的任何内容。这就是我想要返回到python中的信息。顺便说一句,按照您的方法,我得到的输出是空的。@DomenicodiCugno:我假设您的短语“output”的意思是标准输出流stdout。如果它被发送到其他地方,那么您必须以其他方式捕获它。这可能是
check\u输出不起作用的原因。您通过错误(stderr)流获得了什么信息吗?你能确认你所说的输出是什么意思吗?