方法1:使用MATLAB Engine API for Python
这是最直接的方法,允许你在Python中直接调用MATLAB代码。
1. 首先安装MATLAB Engine API for Python:
cd "matlabroot/extern/engines/python"
python setup.py install
2. Flask应用示例:
from flask import Flask, render_template
import matlab.engine
app = Flask(__name__)
@app.route('/')
def index():
# 启动MATLAB引擎
eng = matlab.engine.start_matlab()
# 运行MATLAB代码
result = eng.sqrt(4.0)
# 关闭引擎
eng.quit()
return f'MATLAB计算结果: {result}'
if __name__ == '__main__':
app.run(debug=True)
方法2:生成图像并显示
如果MATLAB生成了图形,可以保存为图片然后在网页中显示:
from flask import Flask, render_template
import matlab.engine
import os
from datetime import datetime
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'static/images'
@app.route('/')
def index():
# 确保目录存在
if not os.path.exists(app.config['UPLOAD_FOLDER']): os.makedirs(app.config['UPLOAD_FOLDER'])
# 生成唯一文件名
filename = f"plot_{datetime.now().strftime('%Y%m%d%H%M%S')}.png"
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename)
# 启动MATLAB引擎并生成图形
eng = matlab.engine.start_matlab()
eng.eval("x = 0:0.1:2*pi;", nargout=0)
eng.eval("y = sin(x);", nargout=0)
eng.eval(f"plot(x,y); saveas(gcf, '{filepath}');", nargout=0)
eng.quit()
return render_template('show_plot.html', plot_image=filename)
if __name__ == '__main__':
app.run(debug=True)
对应的模板文件 templates/show_plot.html:
方法3:使用MATLAB Runtime和编译的MATLAB代码
如果你不想在服务器上安装完整的MATLAB,可以使用MATLAB Runtime:
1. 将MATLAB代码编译为Python可调用的函数
2. 部署时只需要MATLAB Runtime环境
from flask import Flask
import my_compiled_matlab_function # 这是你编译的MATLAB函数
app = Flask(__name__)
@app.route('/')
def index():
result = my_compiled_matlab_function.my_matlab_function()
return f'MATLAB计算结果: {result}'
方法4:通过系统调用运行MATLAB脚本
from flask import Flask
import subprocess
app = Flask(__name__)
@app.route('/')
def index():
# 运行MATLAB脚本并捕获输出
result = subprocess.run(['matlab', '-batch', 'disp(sqrt(4));'],
capture_output=True, text=True)
return f'MATLAB输出: {result.stdout}'
注意事项
1. 性能考虑:每次请求都启动MATLAB引擎会有较大开销,考虑使用连接池或保持引擎长时间运行
2. 错误处理:确保妥善处理MATLAB引擎可能出现的错误
3. 安全性:如果允许用户输入MATLAB代码,务必做好沙箱防护,避免代码注入
4. 资源管理:MATLAB可能消耗大量内存,确保服务器有足够资源
以上方法可以根据你的具体需求选择使用。如果只是简单的数值计算,方法1最直接;如果需要显示图形,方法2更合适;如果需要部署到生产环境,方法3可能是更好的选择。