提示:版本要求: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
节内容。
总结
没心情总结…