matlab调用python库函数和自定义脚本函数
作者:matrix 被围观: 5,105 次 发布时间:2019-07-15 分类:零零星星 | 无评论 »
本来只是想获取字符串的MD5hash值,结果发现麻烦。首先去mathworks找到的DataHash,GetMD5这些函数要么无法使用,要么就是计算出来的md5值是错误的,反正达不到效果。
刚开始以为mathworks的代码必须登录账户才能下载,现在才发现,点击Overview旁边的Functions
选项卡就能看到源代码。 😂
当初就算是找到了一些函数也是不能使用,最后还是使用python库来解决。好在matlab对python的调用非常简单。直接使用py
库就好了,唯一的问题就是有些python的语法和matlab不同,比如切片[:::]
操作这些。
安装python3环境
2019-08-19测试发现macos中3.7版本可以,但是在centOS中就调用失败。所以就centOS中测试安装3.5的版本了。
后面发现应该是编译时的enable-shared参数问题。
2020-02-18centos中测试可以直接用conda来安装python3.5使用,3.6,3.7测试调用失败!
开始手动编译安装
cd ~
yum install zlib-devel bzip2-devel openssl-devel ncurese-devel
wget https://www.python.org/ftp/python/3.5.0/Python-3.5.0.tgz
tar xf Python-3.5.0.tgz
cd Python-3.5.0
./configure --enable-shared #matlab要求必须设置enable-shared参数
make && make install
参考:
https://ww2.mathworks.cn/help/matlab/matlab_external/undefined-variable-py-or-function-py-command.html#buialof-67
https://ww2.mathworks.cn/help/matlab/getting-started-with-python.html?lang=en
切换默认的python解释器
matlab输入
pyversion`可以查看python解释器路径,如果需要修改:
pyversion /usr/local/bin/python3 %切换到python3.7指定路径
直接调用python内置函数
计算字符串md5函数
使用python的hashlib库进行操作
function[re]=md5(str)
%{
依赖python进行md5 hash
%}
m2 = py.hashlib.md5();
m2.update(py.str(str).encode('utf-8'));
re = char(m2.hexdigest());
说明:
此函数依赖python环境,确保系统中有安装。
兼容Linux,Mac,Windows
最后char函数是将py.str
类型转换为matlab的str
知道了这个操作,以后很多操作就会非常简单。
比如
获取当前时间戳:
str2num(char(py.int(py.time.time())))
直接用py
库来调用即可,最后再使用matlab函数str2num,char处理成number类型。
调用自定义.py脚本函数
上面的方法倒是可以解决一部分难题,但是遇到方括号[]、百分号%操作符这些直接在.m
文件中就不会执行了。毕竟matlab是以它的语法来解析,这样只得起调.py
文件来操作。
新建test.py
文件位于当前工作目录
def func():
return '123'[::-1]
载入python脚本:
%脚本所在路径,空字符串表示当前目录
path = '' %当前目录
%path = 'a/' %当前的子目录a
if count(py.sys.path,path) == 0
insert(py.sys.path,int32(0),path);
end
%清除脚本缓存,执行重载操作
clear classes;
mod = py.importlib.import_module('test');%载入的脚本模块
%mod = py.importlib.import_module('a.test');%载入的子目录下的脚本模块
py.importlib.reload(mod);
调用py.test.func
即可得到切片结果321
,注意为py.str
类型。
子目录形同:py.子目录.文件名.函数名
当修改py文件之后再调用会发现还是之前的结果,matlab缓存了之前的python脚本,所以这里需要clear classes...
这类操作。
参考:
MATLAB 调用 Python
https://www.cnblogs.com/zknublx/p/6212590.html
https://blog.csdn.net/jnulzl/article/details/51170859
https://zhuanlan.zhihu.com/p/42598340
https://blog.csdn.net/x5675602/article/details/52134981
http://www.1cae.com/a/MatLab/52/python-matlab-8943.htm