Installing pyuno (LibreOffice) for private Python build

北城以北 提交于 2019-12-04 14:09:24

Once you try to run PyUNO off any other python executable than the one provided with LO, things do get rough.

The SEGV on Mac is because LO's libpyuno.dylib (loaded via libuno.dylib, which in turn is loaded via "import uno") references @loader_path/LibreOfficePython.framework/Versions/3.3/LibreOfficePython (run "otool -L" on that file; path as on current LO master; paths are a little different on various LO versions). When run from a different python process than LO's, that means there'll be two python runtimes in the process (and the LO one not even properly initialized, probably), and that leads to a SEGV somewhere in that LibreOfficePython. (This happens to work better on Linux, where libpyuno.so references libpython3.3m.so, and normally finds the LO python one's next to itself via its RPATH, but if any libpython3.3m.so happens to already be loaded into the process (from the other python), the Linux loader happily re-uses that one.)

One gross hack on Mac is to use install_name_tool to "rewire" libpyuno.dylib to reference the other python's Python.framework/Versions/3.3/Python (by absolute path) instead of @loader_path/LibreOfficePython.framework/Versions/3.3/LibreOfficePython.

Another gotcha is that LO's python (on Linux and Mac) is actually a shell script around the true python executable. It needs to set up a number of env vars (whose purpose is even documented in the script). To make PyUNO work from a different python you'll want to set up these env vars too, esp. UNO_PATH, URE_BOOTSTRAP, and the parts of PYTHONPATH that find the LO-specific libs (rather than those that come with python itself). Note that the details of those env vars' values differ among LO versions.

It is a late answer and I don't have the exact same setup as you have, but for me, I could simply adjust PYTHONPATH so that the directory where uno.py lives is known to python.

bash> export PYTHONPATH=${PYTHONPATH}:/usr/lib/libreoffice/program
bash> python
>>> import uno

A requirement is that your LibreOffice/OO python has the same version as your regular one: Python will compile the .py to .pyc, and that format is not transferable between versions (at least, that is not guaranteed).

Do a locate uno.py if you are not sure where your file is. Inspecting where /usr/bin/libreoffice links to may also help.

Jens

Linux

dirkjot's answer to this thread works great on Linux.

Mac (Yosemite)

Things are a little bit more tricky here, and as of LibreOffice 4.3 I still can't extend my PYTHONPATH to LibreOffice and import uno without crashing on Mac:

localhost ~ > PYTHONPATH=$PYTHONPATH:/Applications/LibreOffice64.app/Contents/MacOS python3.3
Python 3.3.6 (default, Nov 12 2014, 18:18:46) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.54)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import uno
Segmentation fault: 11

But here is what works for me. First, I have to make sure that both Python and my LibreOffice are built for 32b or 64b; they can't be mixed. I'm working with 64b MacPorts Python 3.3 and 64b LibreOffice for Mac (download link) which comes with Python 3.3. Second, I have to make sure to run the right Python and extend the PYTHONPATH correctly. Because I can't run my MacPorts Python and extend it with LibreOffice's path, I have to do it the other way around: run the LibreOffice Python and extend it with my MacPorts Python path:

localhost ~ > PYTHONPATH=$PYTHONPATH:/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages /Applications/LibreOffice64.app/Contents/MacOS/python
Python 3.3.5 (default, Dec 12 2014, 10:33:58) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.51)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import uno
>>> import lxml
>>> 

Note how uno is imported from the LibreOffice's Python path, and lxml lives in MacPort's Python path.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!