为私有Python构建安装pyuno(LibreOffice)

时间:2013-03-05 11:58:06

标签: python libreoffice uno

有关此主题here广告here的一些相关主题,但它们似乎有点过时了。

我刚刚下载了内置Python 3.3.0的LibreOffice 4.使用Python我可以很好地导入和使用UNO,并从我的Python脚本控制Office。但是,我的许多其他模块都没有从Python中丢失 - 而UNO是Python中唯一缺少的模块。

有没有办法为我的本地Python安装pyuno? LibreOffice源代码树包含一个pyuno / source树,但我不确定如何构建/将其集成到另一个Python树中。

这里有什么经历吗?救命?提示? Dos,Don'ts,Dohs?

编辑 answer below适用于Linux,我可以将PYTHONPATH扩展为导入uno。 Mac上的问题有所不同,请查看the other answer

编辑在修补Python路径时,一定要考虑this anwer

4 个答案:

答案 0 :(得分:4)

一旦你尝试运行PyUNO以外的任何其他python可执行文件而不是LO提供的那个,事情就会变得粗糙。

Mac上的SEGV是因为LO的libpyuno.dylib(通过libuno.dylib加载,而后者通过&#34加载;导入uno")引用@ loader_path / LibreOfficePython.framework / Versions / 3.3 / LibreOfficePython(运行" otool -L"在该文件上;路径与当前LO主站相同;路径在各种LO版本上略有不同)。当从与LO不同的python进程运行时,这意味着在该进程中将有两个python运行时(并且LO可能甚至没有正确初始化),这导致SEGV在某处LibreOfficePython。 (这恰好在Linux上工作得更好,其中libpyuno.so引用libpython3.3m.so,并且通常通过其RPATH找到LO python旁边的一个,但是如果任何libpython3.3m.so恰好已经是加载到进程中(来自其他python),Linux加载器很乐意重新使用那个。)

Mac上的一个严重攻击是使用install_name_tool来重新启动" libpyuno.dylib引用其他python的Python.framework / Versions / 3.3 / Python(通过绝对路径)而不是@ loader_path / LibreOfficePython.framework / Versions / 3.3 / LibreOfficePython。

另一个问题是,LO的python(在Linux和Mac上)实际上是围绕真正的python可执行文件的shell脚本。它需要设置一些env变量(其目的甚至记录在脚本中)。为了使PyUNO能够从不同的python中运行,你也想要设置这些env vars,尤其是。 UNO_PATH,URE_BOOTSTRAP和PYTHONPATH的部分找到了特定于LO的库(而不是那些随python本身提供的库)。请注意那些env vars'的细节。 LO版本的值不同。

答案 1 :(得分:2)

这是一个迟到的答案,我没有完全相同的设置,但对我来说,我可以简单地调整PYTHONPATH,以便知道uno.py所在的目录

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

要求是你的LibreOffice / OO python与你的常规版本相同:Python会将.py编译为.pyc,并且该格式不能在版本之间转换(至少,不能保证)。

如果您不确定文件的位置,请执行locate uno.py。检查/usr/bin/libreoffice链接的位置也可能有所帮助。

答案 2 :(得分:0)

<强>的Linux

dirkjot's answer这个帖子在Linux上运行得很好。

Mac (Yosemite)

这里的事情有点棘手,从LibreOffice 4.3开始,我仍然无法将我的PYTHONPATH扩展到LibreOffice和import uno,而不会在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

但这对我有用。 首先,我必须确保Python和我的LibreOffice都是为32b或64b构建的;他们无法混合。我正在使用Python 3.3附带的64b MacPorts Python 3.3和64b LibreOffice for Mac(download link)。 其次,我必须确保运行正确的Python并正确扩展PYTHONPATH。因为我无法运行我的MacPorts Python并使用LibreOffice的路径扩展它,所以我必须反过来:运行LibreOffice Python并使用我的MacPorts Python路径扩展它:

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
>>> 

注意如何从LibreOffice的Python路径导入unolxml存在于MacPort的Python路径中。

答案 3 :(得分:0)

我最近想在django中使用pyuno(即,我在电子表格中有一个定价引擎,而django应用打开了它,填充了用户输入,并在重新计算后检索了价格)。唯一合理的解决方案是在您正在使用的任何平台上使用docker容器或linux vm(我在Mac上,对Ubuntu机器使用并行)。任何其他解决方案都会浪费大量时间。

在Linux环境中,您所要做的就是运行apt-get install python3-uno并将python路径设置为$PYTHONPATH:/usr/lib/python3/dist-packages/(即apt-get安装python3-uno的地方就可以了) (仅在linux环境中)。