在Jupyter Notebook中调用MATLAB代码无法输出结果的问题咨询
解决Jupyter Notebook中调用MATLAB脚本无输出的问题
针对你遇到的在Jupyter里调用MATLAB脚本没输出,但常规Python环境正常的问题,这是MATLAB R2017a版本的Engine对Jupyter输出流适配不完善导致的,给你两个可行的解决办法:
方法1:修改MATLAB脚本为函数,通过返回值获取结果
最稳妥的方式是把原脚本改成带返回值的函数,这样Python可以主动接收计算结果,不需要依赖MATLAB的输出流。
修改后的triarea.m代码:
function a = triarea() % 计算三角形面积的函数 b = 5; h = 3; a = 0.5*(b.*h); end
对应的Python调用代码:
import matlab.engine # 启动MATLAB引擎 eng = matlab.engine.start_matlab() # 调用函数并获取返回值 area_result = eng.triarea() # 在Jupyter中打印结果 print(f"a = {area_result:.4f}")
运行这段代码就能在Jupyter里看到a = 7.5000的输出了。
方法2:用MATLAB的evalc函数捕获输出(无需修改原脚本)
如果不想改动原MATLAB脚本,可以借助MATLAB内置的evalc函数,它能捕获脚本执行过程中的所有输出内容,再由Python打印出来。
Python调用代码:
import matlab.engine eng = matlab.engine.start_matlab() # 用evalc执行脚本并捕获输出 output_content = eng.evalc('triarea') # 打印捕获到的内容 print(output_content)
执行后会直接输出MATLAB脚本里的计算结果,和你在常规Python环境里看到的一致。
为什么之前的stdout重定向没用?
MATLAB R2017a的Engine for Python对Jupyter的自定义输出流支持有限,Jupyter的stdout和常规Python脚本的系统输出流不是同一个对象,所以用io.StringIO重定向无法捕获到MATLAB的输出。上面两种方法都是绕开这个适配问题的有效方案。
另外要确认你的Jupyter环境确实是安装了MATLAB Engine的Python3.5环境,避免因为环境不一致导致的问题。
内容的提问来源于stack exchange,提问作者sdrinz23




