Канал связи Libreoffice не работает при запуске из Pycharm - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь разработать макросы Libreoffice Cal c python в Pycharm. Я хочу провести тест внутри Pycharm. Тесты работают нормально, когда libreoffice запускается за пределами Pycharm, но не удается, когда я пытаюсь запустить его непосредственно из Pycharm.

Я пробовал 2 разных варианта запуска libreoffice.

Из моего терминала Ubuntu

/opt/libreoffice6.4/program/soffice --calc --accept="pipe,name=lopipe;urp;StarOffice.ServiceManager" --nologo&

С функцией python:

args = ["/opt/libreoffice6.4/program/soffice", "--calc",
        "--accept=\"pipe,name=lopipe;urp;StarOffice.ServiceManager\""]
subprocess.Popen(args, universal_newlines=True)

Следующий код дает мне активный лист.

def current_active_sheet():
    localContext = uno.getComponentContext()
    resolver = localContext.ServiceManager.createInstanceWithContext(
        "com.sun.star.bridge.UnoUrlResolver", localContext)
    ctx = resolver.resolve("uno:pipe,name=lopipe;urp;StarOffice.ComponentContext")
    desktop = ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
    model = desktop.getCurrentComponent()
    return model.CurrentController.ActiveSheet

Когда Libreoffice запускается с терминала Ubuntu, Функция current_active_sheet прекрасно работает внутри Pycharm, вызываемой, например, из тестовых модулей. Но когда Libreoffice запускается из Pycharm с python subprocess.Popen, функция вызывает исключение подключения, хотя libreoffice работает правильно.

Я пробовал это как с опциями сокета и канала для uno bridge, так и get такое же поведение.

Трассировки lsof дают нечто странное, как если бы pycharm не передавал имя канала в систему.

Вот выдержка из результата lsof, когда libreoffice имеет значение запускается из терминала ubuntu, есть ссылка на lopipe

soffice.b 13506 13517             yves    7u     unix 0x0000000000000000       0t0     336561 /tmp/OSL_PIPE_1000_SingleOfficeIPC_6e6e1dcdf8a8f89eb21d8fe15230aa95 type=STREAM
soffice.b 13506 13517             yves   54u     unix 0x0000000000000000       0t0     310587 /tmp/OSL_PIPE_1000_lopipe type=STREAM

и тот же фрагмент, когда Libreoffice запускается из Pycharm с subprocess.Popen. Лопайпа вообще нет ...

soffice.b 13407 13418             yves    7u     unix 0x0000000000000000       0t0     307196 /tmp/OSL_PIPE_1000_SingleOfficeIPC_6e6e1dcdf8a8f89eb21d8fe15230aa95 type=STREAM
soffice.b 13407 13419             yves    7u     unix 0x0000000000000000       0t0     307196 /tmp/OSL_PIPE_1000_SingleOfficeIPC_6e6e1dcdf8a8f89eb21d8fe15230aa95 type=STREAM

1 Ответ

0 голосов
/ 01 мая 2020

При запуске в подпроцессе, включите задержку, например time.sleep(), чтобы у LO было несколько секунд до запуска кода API. Это не требуется при запуске с терминала, потому что последовательный запуск дает время для запуска LO. Обычно я рекомендую запускать LO из терминала, хотя должна быть возможность запуска с подпроцессом.

Кроме того, у меня был больший успех при соединении с сокетами, а не с трубами. Не уверен насчет PyCharm конкретно; Я использовал его с API UNO раньше, но не с подпроцессом.

Наконец, попробуйте следующие ссылки. Оба требуют много чтения, но, кажется, имеют хорошую информацию.

То, что вы пытаетесь сделать с PyCharm, часто делалось с Java IDE, поэтому в Интернете должны быть различные примеры.

...