https://stackoverflow.com/a/8978435/1335492
...показывает, как вызвать скрипт Python из LibreOffice BASIC: (Как я могу вызвать макрос Python в формуле ячейки в OpenOffice.Org Calc? )
Function invokeScriptFunc(..., args As Array, outIdxs As Array, outArgs As Array)
...
invokeScriptFunc = oScript.invoke(args, outIdxs, outArgs)
end Function
Но это не работает для меня. Я получаю «БАЗОВАЯ ошибка времени выполнения. Аргумент не является обязательным» для outArgs. С другой стороны, «oScript.invoke(args, Array(), Array())» не является ошибкой.
Пример не был ошибочным 10 лет, вряд ли будет ошибочным сегодня. Но у меня нет примера его работы со скриптом Python, который возвращает список: возможно, это моя проблема.
Сценарий, который я пытаюсь использовать:
def MyFunc(a,b):
return [a,b]
Я не получаю ошибку, когда пытаюсь
Function invokeScriptFunc(..., args As Array, outIdxs As Array)
...
dim outArgs as array
invokeScriptFunc = oScript.invoke(args, outIdxs, outArgs)
end Function
или
invokeScriptFunc = oScript.invoke(args, outIdxs, array())
но в любом случае я не приблизился к тому, чтобы увидеть возвращаемое значение, которое я хочу. FWIW, когда я "затемняю outArgs как массив", .invoke возвращает объект с lbound=0 и ubound=-1. outArgs(0) недействителен.
Я не пытаюсь анализировать вывод: это будет позже. Я просто пытаюсь заставить его работать без ошибок.






Первый параметр .invoke — (все аргументы).
Второй параметр .invoke — это список, указывающий, какие аргументы являются выходными.
Третий параметр .invoke — (выходные аргументы). Потому что в Java аргументы метода неизменяемы. Интерфейс Java возвращает значения в (выходные аргументы). Интерфейс python не использует (выходные аргументы): вывод возвращается как возвращаемое значение .invoke.
Таким образом, для скриптов Python outIdxs должен быть пустым массивом, а outArgs — пустым массивом.
Это не объясняет, почему передача пустого массива в outIdxs и outArgs иногда является ошибкой, в зависимости от того, как был объявлен пустой массив. Это связано с тем, как происходят объявления и ошибки определяются, обнаруживаются и сообщаются в LibreOffice BASIC, что является совершенно отдельной темой.
Все необходимое для возврата списка описано в документации по адресу https://help.libreoffice.org/latest/en-US/text/sbasic/guide/basic_2_python.html. Вот рабочий код.
Function invokeScriptFunc(args As Array)
oScript = GetPythonScript("filename.py$MyFunc", "user")
invokeScriptFunc = oScript.invoke(args, Array(), Array())
End Function
Sub call_invokeScriptFunct
result = invokeScriptFunc(Array(5, 5))
MsgBox result(1)
End Sub
Я изменил код Python, чтобы он действительно что-то делал.
def MyFunc(a, b):
return [a+1, b-1]
Результат: 4, что равно 5 минус 1.
Ваш пример не завершен — он должен показать код, который выдает ошибку. У меня это работает без проблем:
result = invokeScriptFunc(Array(5, 5), Array(), Array()). Я пока буду ставить минусы, пока вы это не исправите (извините, я знаю, что получать минусы неинтересно, но я уверен, что вы сможете это исправить).