Thank you everybody for your feedback, that was very helpful. Here’s my current 
working implementation:

- Spawn the soffice process which will function as a “server”

    customenvdir = tempfile.TemporaryDirectory()
    p = subprocess.Popen("soffice 
--accept=\"pipe,name=SOME_PIPE;url;StarOffice.ServiceManager\" --headless 
--invisible")

- Terminate the soffice process when I need to

    p.terminate()                                                               
               
    # I assume that the pipe will be cleaned up as well?
    if customenvdir:                                                            
               
        cleanup_tmp(customenvdir)                                               
        

- Having soffice running, I can connect to it as usual:

    try:
        local = uno.getComponentContext()                                       
                    
        resolver = 
local.ServiceManager.createInstanceWithContext("com.sun.star.bridge.UnoUrlResolver",
 local)
        context = 
resolver.resolve("uno:pipe,name=SOME_PIPE;url;StarOffice.ComponentContext")
        desktop = 
context.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", 
context)
        document = desktop.loadComponentFromURL("file://…", "_blank", 0, None)
        controller = document.getCurrentController()                            
                        
    except:                                                                     
                    
        pass # Handle

- When done with the document, "close" it down but leave the soffice process 
untouched and available for more. Here, I am not sure about the other resources 
that were allocated when documents are being loaded:

    # controller.??                                                             
                
    if document:                                                                
               
        # https://forum.openoffice.org/en/forum/viewtopic.php?f=25&t=75367      
                    
        if has_interface(document, "com.sun.star.util.XCloseable"):             
               
            document.close(True)                                                
               
        else:                                                                   
                    
            document.dispose()                                                  
               
    # desktop.terminate()                                                       
               
    # context.??                                                                
               
    # resolver.??                                                               
               
    # local.??                                                                  
               

As Tor suspected, I noticed that desktop.terminate() removes access to the pipe 
so that others can not open documents anymore. However, it doesn't seem to 
terminate the soffice process itself.

Also, I have performance concerns for this approach: loading and running 
through just two documents simultaneously seemed to be unproportionally slow!?

Thank you!
Jens

--
Jens Tröger
http://savage.light-speed.de/
_______________________________________________
LibreOffice mailing list
LibreOffice@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice

Reply via email to