Использование пользовательской функции Matlab в Python дает ошибку - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть пользовательская функция Matlab. Это написано кем-то другим. В этом файле несколько функций, но первая функция, имя которой совпадает с именем файла .m, это та, которую я пытаюсь вызвать. Он получает 4 аргумента (строка, строка, строка, логическое значение). Обычно в Matlab я называю это так: function ('string', 'string, true) При попытке в Python я использую следующий код.

def CodeGenerationAndResim(self, Models=None, Resim=False, Type='TW'):
    """ This function will start Matlab and generates code for each Simulink model
        and creates Resim archives for the release.
        All variables:
            Models                      - All Sim Modelto generate c code for
            Resim                       - Running Resim function
            Type                        - Type of Resim archive
            matlabEngine                - Matlab engine to start Matlab
            MatlabEngineSuccessfull     - Checks if Matlab engine is started without error
            CodeGenSuccessfull          - Checks if Code Generation is successsful
            ResimSuccessfull            - Checks if Resim function is performed successfully.
    """


    # Check variables
    MatlabEngineSuccessfull = True
    CodeGenSuccessfull = True
    ResimSuccessfull = True


    # Call Matlab engine
    try:
        matlabEngine = matlab.engine.start_matlab('-nodesktop', background = False)
        matlabEngine.addpath("C:\\temp")
    except EngineError as e:
        MatlabEngineSuccessfull = False
        Print("Could not start Matlab. Do you have Matlab 64 bits installed?")

    # Generate code for models in a loop
    if Models is not None and MatlabEngineSuccessfull:
        for model in Models:
            try:
                matlabEngine.rtwbuild(model)
            except Exception as e:
                CodeGenSuccessfull = False
                print('Something went wrong')

    # Running Resim
    if Resim and MatlabEngineSuccessfull and CodeGenSuccessfull:
        try:
            matlabEngine.resimPrepareNewVersion('all','DAS2_TwYYWW_2005',1)
        except Exception as e:
            ResimSuccessfull = False
            print(e)


    return MatlabEngineSuccessfull, CodeGenSuccessfull, ResimSuccessfull

Я получаю следующую ошибку:

Error using resimPrepareNewVersion
Too many output arguments.
Too many output arguments.

Я не понимаю ошибку. Я уже привожу те же аргументы, что и в Matlab. Даже когда я даю 3, 2 или нет аргументов, я получаю ту же ошибку. Когда Matlab загружается, эти функции загружаются автоматически, поэтому мне не нужно добавлять путь, но я сделал это в любом случае. Тем не менее, я пытался, не давая никакого пути. Генерация кода и запуск Matlab проходит без проблем. В Matlab эта функция загружает некоторые другие файлы и открывает информационное диалоговое окно, если оно имеет значение.

1 Ответ

1 голос
/ 04 апреля 2020

Было действительно странно, что я все время красил ошибку как Too many input arguments вместо output arguments

Я решил проблему, вставив nargout=0.

Отредактировано:

matlabEngine.resimPrepareNewVersion('all','DAS2_TwYYWW_2005',1)

Кому:

matlabEngine.resimPrepareNewVersion('all','DAS2_TwYYWW_2005',1, nargout=0)

И это сработало очень хорошо. Спасибо.

...