【问题标题】:Run matlab script in python - error在python中运行matlab脚本 - 错误
【发布时间】:2018-02-02 22:10:45
【问题描述】:

我在 python 中运行 matlab 代码时遇到问题。 当我运行我的简单代码时,我在 matlab 控制台中有以下信息:

未定义的函数或变量“信使”。

matlabserver 中的错误(第 7 行) messenger('init', socket_address);

Matlab 代码:

%% MATLAB
function lol = yourfunc(args)
    arg1 = args.arg1;
    arg2 = args.arg2;
    lol = arg1 + arg2;
end

Python 代码:

from pymatbridge import Matlab
mlab = Matlab()
mlab.start()
res = mlab.run('...path\yourfunc.m', {'arg1': 3, 'arg2': 5})

print(res['result'])

【问题讨论】:

  • 嗨,你是在 32 位 linux 机器上运行这个吗?
  • 我在 windows 10 64 和 pycharm 上运行它
  • 看着这个github thread @quic0:我在 Windows 10 上遇到了同样的问题。问题是 Matlab 找不到 mex 文件 messenger.mexw64。如果您将 mex 文件从 pymatbridge\messenger\mexw64 复制到 Python 包文件夹中的 pymatbridge\matlab,它就会连接。 似乎所有其他问题都与专门为您的系统重新编译 messenger mex 文件有关
  • 好的,现在可以了,但是我有一个问题,当我在 pycharm 中打印 'res' 时,我有这个 "{'result': '', 'success': False, 'content' : {'stdout': '输入参数太多。'}}"
  • Dzejkob,恭喜您回答了第一个问题,欢迎访问该网站。请阅读how to ask questions 上的网站指南。具体来说,避免将第二个问题与原始问题混为一谈(尤其是因为两者本质上完全不相关,并且第二个问题不再对应于问题主体),而是更愿意将此类问题作为单独的独立问题提出。此外,考虑使用信息量更大的标题,以帮助未来的用户在谷歌上搜索相同的错误。 “Matlab 错误”信息量极少。

标签: python matlab


【解决方案1】:

所以作为对 OP 问题的专门回答(最初需要为 windows 10 重新编译 mex 文件 messenger.mexw64 [参见原帖 cmets]):


好的,现在可以了,但是我有一个问题,当我在 pycharm 中打印 'res' 时,我有这个 "{'result': '', 'success': False, 'content': {'stdout' : '输入参数太多。'}}"

在您的 matlab 函数中,您只陈述了一个论点:

function lol = yourfunc(args)

但是当你在 python 中调用它时,你会使用两个输入参数(arg1 和 arg2)来调用它:

res = mlab.run('...path\yourfunc.m', {'arg1': 3, 'arg2': 5})

在 matlab 函数输入中,您假设它是一个具有至少两个字段 arg1 & arg2; 的数据结构;当您调用时,您正在从结构中引用这些变量

args.arg1
args.arg2

由于我不确定您是否可以通过这种技术传递数据结构(作为来自 python 函数的 JSON 样式字符串输入),我建议将 Matlab 函数的输入参数更改为:

  1. 更改您的函数以支持两个参数,例如从 python 调用它的方式:

    %% MATLAB
    function lol = yourfunc(input1,input2)
        arg1 = input1;
        arg2 = input2;
        lol = arg1 + arg2;
    end
    
    # PYTHON (just to be clear)
    from pymatbridge import Matlab
    mlab = Matlab()
    mlab.start()
    res = mlab.run('...path\yourfunc.m', {'input1': 3, 'input2': 5})
    
    print(res['result'])
    
  2. 或者,如果您想处理无限数量的输入(使用 varargin):

    %% MATLAB 
    function lol = yourfunc(varargin)
        arg1 = varargin{1};
        arg2 = varargin{2};
        lol = arg1 + arg2;
    end
    
    # PYTHON (just to be clear)
    from pymatbridge import Matlab
    mlab = Matlab()
    mlab.start()
    res = mlab.run('...path\yourfunc.m', {'input1': 3, 'input2': 5})
    
    print(res['result'])
    

这应该会删除有关输入参数过多的错误消息并成功运行:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-12-29
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多