Python调用MATLAB程序

本文详细介绍了如何在Python3.7环境下调用MATLABR2020a,包括常规配置方法、创建新的Python虚拟环境以解决版本兼容问题,以及解决安装和导入MATLABEngineAPIforPython过程中可能出现的错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:版本要求:Python 3.7,MATLB R2020a


前言

为纪念2024年1月16日浪费的4个小时,而创作本教程,以明晰如何在Python程序中顺利调用MATLAB。同时,在这里,感谢ChatGPT在我调试程序解决bug过程中的知无不言,无私奉献,耐心指导。
该文章之前被CSDN官方设置了VIP访问,现在重新发布了一篇新文章,内容与之前的相同,谢谢关注!
关键字:Python调用MATLAB,matlab.engine,MATLAB Engine for Python


一、常规方法

常规方法不一定适合所有可能遇到的情况

1.1 MATLAB配置MATLAB Engine API for Python

  • 打开MATLAB软件(本文中指的是MATLAB R2020a),在命令行输入以下指令并回车执行:
fullfile(matlabroot, 'extern', 'engines', 'python')

该命令旨在找到 MATLAB Engine API for Python 安装脚本所在的路径。这里,给出明确的安装脚本所在路径C:\Program Files\MATLAB\R2020a\extern\engines\python,安装脚本为该路径下的python文件setup.py

在这里插入图片描述

  • 进入MATLAB Engine API for Python 目录(下面两条指令作用一致):
cd (fullfile(matlabroot,'extern','engines','python'))  % MATLAB命令窗口
cd /path/to/matlab/extern/engines/python               % Windows PowerShell
  • 运行安装脚本:
system('python setup.py install')   % MATLAB命令窗口
python setup.py install             % Windows PowerShell

在这里插入图片描述
正常情况下,这样MATLAB便配置MATLAB Engine API for Python成功了。若报错,请耐心浏览本教程第二部分内容。
报错内容为

OSError: MATLAB Engine for Python supports Python version 2.7, 3.6, and 3.7, but your version of Python is 3.11

1.2 测试Python

  • 验证安装。打开Python程序,导入:
import matlab.engine

在这里插入图片描述

正常情况下,无报错说明Python已经可以调用MATLAB程序了。若报错,请耐心浏览本教程第二部分内容。
报错内容为

No module named matlab

二、解决方案

2.1 创建新的Python虚拟环境

由于MATLAB R2020a目前只支持Python的三个版本(2.7, 3.6, 3.7),MATLAB默认的Python的环境不再使用(MATLAB R2020a默认的Python是3.11版本),且系统安装的Python环境所对应的版本也不一定是3.7。因此,建议使用conda新建一个Python虚拟环境(安装Anaconda以及配置的内容不再赘述)。假设已经安装了conda,那么,打开Anaconda的Anaconda PowerShell Prompt窗口,输入以下命令并回车执行:

conda create -n EAS python=3.7

2.2 MATLAB配置MATLAB Engine API for Python

  • 查看当前MATLAB的Python版本及路径。在MATLAB命令行输入并执行:
pyversion

返回内容为:

       version: '3.11'
    executable: 'F:\Python\python.EXE'
       library: 'F:\Python\python311.dll'
          home: 'F:\Python'
      isloaded: 0
  • 更改MATLAB的Python解释器为新建的Python虚拟环境下的版本(系统默认的conda虚拟环境目录为C:\Users\admin\.conda\envs):
new_python_path = 'C:\Users\admin\.conda\envs\EAS\python';
pyversion(new_python_path);
  • 查看MATLAB的Python版本及路径。在MATLAB命令行输入并执行:
pyversion

在这里插入图片描述

  • 尝试安装MATLAB Engine API for Python。进入MATLAB Engine API for Python 目录,并运行安装脚本:
cd (fullfile(matlabroot,'extern','engines','python'))
system('python setup.py install')

若仍然报错,请继续耐心阅读本文。
在这里插入图片描述

2.3 Python配置MATLAB Engine API for Python

由于MATLAB无法解决安装及配置问题,在接下来的内容将尝试在Python中解决上述问题。现在的主要目的是在新建的Python虚拟环境中实现matlab.engine的导入,即配置MATLAB Engine API for Python。以下内容在Anaconda的Anaconda PowerShell Prompt窗口中运行。

  • 激活新建的Python虚拟环境,并进入MATLAB Engine API for Python所在的文件目录:
conda activate EAS
cd "C:\Program Files\MATLAB\R2020a\extern\engines\python"
  • 运行该目录下的安装脚本:
python setup.py install

若报错(拒绝访问),说明未获得权限操作C盘的文件。请使用管理员权限重新打开Anaconda PowerShell Prompt窗口,并执行上述指令。
在这里插入图片描述

  • 安装脚本运行成功后将显示:

在这里插入图片描述

  • 使用pip指令查看是否已成功安装matlabengineforpython:
pip list

在这里插入图片描述

  • 验证安装。打开Python程序,导入:
import matlab.engine

在这里插入图片描述
所继续报错,且报错内容为:

No module named 'matlab.engine'; 'matlab' is not a package
  • 调整新建Python虚拟环境的文件结构(本小节是摸索出的结果,不一定靠谱,但是确实解决了问题)

打开新建的Python虚拟环境的路径C:\Users\admin\.conda\envs\EAS,进入到Lib,找到site-packages文件夹
在这里插入图片描述
打开site-packages文件夹,找到并打开matlabengineforpython-R2020a-py3.7.egg文件夹,复制该文件夹中的matlab文件夹
在这里插入图片描述
回退到site-packages文件夹中,即当前路径为C:\Users\admin\.conda\envs\EAS\Lib\site-packages,将文件夹粘贴在当前路径下:
在这里插入图片描述

三、调用测试

如下图所示,调用的具体要求是:在main.py文件中调用rongliangyunxing.m文件的函数rongliangyunxing
在这里插入图片描述
具体地,函数有一个字符串形式的输入参数,返回一个浮点数:
在这里插入图片描述
python的调用测试程序为:
在这里插入图片描述
运行结果为:
在这里插入图片描述

四、其他版本问题与解决方案

这一节将介绍MATLAB2022a版本中可能会出现的问题及其相应的解决方案

MATLAB 2022a 对Python版本的要求如下:
OSError: MATLAB Engine for Python supports Python version 2.7, 3.7, 3.8, and 3.9, but your version of Python is 3.11

4.1 配置Python虚拟环境

考虑到目前VS Code不再支持Python3.8版本的程序调试,这里安装符合MATLAB 2022a要求的最高版本Python3.9。

  • 打开Anaconda的PowerShell
  • 新建环境, 输入以下指令:
conda create -n RL python=3.9

4.2 MATLAB配置MATLAB Engine API for Python

4.2.1 在MATLAB中配置正确的Python环境

  • 在MATLAB命令行窗口中输入:
new_python_path = 'C:\Users\admin\.conda\envs\RL\python';
pyversion(new_python_path);
  • 查看当前MATLAB中的Python环境及其版本:
pyversion

得到结果为:
在这里插入图片描述
说明配置成功。

4.2.2 查看MATLAB Engine API for Python的文件路径

  • 在MATLAB命令行窗口中输入:
fullfile(matlabroot, 'extern', 'engines', 'python')

得到的结果为MATLAB Engine API for Python的文件路径,即'F:\MATLAB\extern\engines\python'(该路径由MATLAB的安装路径决定,因人而异)
在这里插入图片描述

4.2.3 安装MATLAB Engine API for Python

  • 尝试安装MATLAB Engine API for Python。进入MATLAB Engine API for Python 目录,并运行安装脚本:
cd (fullfile(matlabroot,'extern','engines','python'))
system('python setup.py install')

如果返回值为9009,说明:

在 Windows 系统中,9009 错误码通常表示命令未找到或执行失败。这意味着系统未能正确执行 python setup.py install 命令

在这里插入图片描述
说明在MATLAB中配置MATLAB Engine API for Python是不可实现的,下述内容将尝试在Python环境中安装MATLAB Engine API for Python工具。

4.3 Python安装MATLAB Engine API for Python

4.3.1 准备工作

打开Anaconda的PowerShell,执行以下命令。

  • 激活环境:
conda activate RL

进入·MATLAB Engine API for Python的文件目录:

cd "F:\MATLAB\extern\engines\python"

4.3.2 安装MATLAB Engine API for Python

继续执行以下命令:

python setup.py install

返回以下报错信息:
在这里插入图片描述

  File "C:\Users\Administer\.conda\envs\RL\lib\site-packages\setuptools\_vendor\packaging\version.py", line 202, in __init__
    raise InvalidVersion(f"Invalid version: {version!r}")
packaging.version.InvalidVersion: Invalid version: 'R2022a'

这个错误提示说明,程序试图使用packaging.version.Version类来解析版本号R2022a,但版本号 R2022a 不符合 PEP 440 规范,因此抛出了 InvalidVersion 异常。

4.3.3 重写MATLAB Engine API for Python的setup.py文件

  • 根据MATLAB Engine API for Python的文件路径找到setup.py文件:
    在这里插入图片描述
  • 打开该文件,将版本信息进行预处理,使其符合 PEP 440 规范。补充以下版本号预处理函数:
def preprocess_version(version: str) -> str:
    if version.startswith('R'):
        version = version[1:]
        version = version.replace('a', '.a0')
    return version

将原本的:

if __name__ == '__main__':

    setup(
        name="matlabengineforpython",
        version=''R2022a'',
        description='A module to call MATLAB from Python',
        author='MathWorks',
        url='https://www.mathworks.com/',
        platforms=['Linux', 'Windows', 'MacOS'],
        package_dir={'': 'dist'},
        packages=['matlab','matlab.engine'],
        cmdclass={'build_py': BuildEngine}
    )

替换为:

if __name__ == '__main__':

    setup(
        name="matlabengineforpython",
        version=preprocess_version('R2022a'),
        description='A module to call MATLAB from Python',
        author='MathWorks',
        url='https://www.mathworks.com/',
        platforms=['Linux', 'Windows', 'MacOS'],
        package_dir={'': 'dist'},
        packages=['matlab','matlab.engine'],
        cmdclass={'build_py': BuildEngine}
    )

在这里插入图片描述保存该文件。

4.3.4 继续尝试安装MATLAB Engine API for Python

  • 在Powershell中继续执行以下命令:
python setup.py install

返回以下报错信息:
在这里插入图片描述
逐条报错信息分析:

C:\Users\Administer\.conda\envs\RL\lib\site-packages\setuptools\dist.py:330: InformationOnly: Normalizing '2022.a0' to '2022a0'
  self.metadata.version = self._normalize_version(self.metadata.version)

这条信息来自 setuptools 中的版本标准化过程。在这里,'2022.a0' 被标准化为 '2022a0',即去掉了版本号中的点 (.),将其转为符合 PEP 440 格式的版本号。这是因为 setuptools 会自动处理和规范版本号,确保它符合标准格式。因此,'2022.a0' 被转换成了 '2022a0',这种格式可以正确地被 Python 工具和库识别和处理。

C:\Users\Administer\.conda\envs\RL\lib\site-packages\setuptools\_distutils\cmd.py:66: SetuptoolsDeprecationWarning: setup.py install is deprecated.

这条警告来自于 setuptools,它告诉你正在使用的 setup.py install 命令已被弃用(deprecated)。setup.py 是一种旧的方式来安装 Python 包,在现代的 setuptools 和包管理工具中,推荐使用 pip install 来安装包。setup.py install 可能不再得到官方的支持,并且将来可能会被完全移除。

  • 改用pip安装。
    由于当前还处于该文件的目录下,即F:\MATLAB\extern\engines\python。只需要执行以下命令即可:
pip install .

在这里插入图片描述

4.3.5 查看是否安装成功

  • 在Powershell中继续执行以下命令:
pip list

在这里插入图片描述
已经成功安装matlabengineforpython版本号为2022a0

4.3.6 测试

在这里插入图片描述
运行该代码,如果不报错说明安装成功,如报错,请查看本文的2.3节内容。

总结

没心情总结…

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值