2013-03-05 133 views
3

有几个关于此主题的相关主题here ad here但它们看起来有些过时。为私人Python版本安装pyuno(LibreOffice)

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

有什么办法可以为我的本地Python安装pyuno? LibreOffice源代码树包含一个pyuno /源代码树,但是我不知道如何去构建/整合到另一个Python树中。

在这里有什么经验?帮帮我?提示? Dos,Do'ts,Dohs?

编辑answer below作品就好了Linux和我没有问题,其延伸的PYTHONPATH导入UNO。 Mac上的问题不同,所以请看the other answer

编辑修补Python路径时,绝对考虑this anwer

+0

我在Ubuntu 13.04中有LibreOffice 4,但在任何Tools-Macro子菜单中都没有提到Python。你有吗? – stenci 2013-07-29 03:29:48

+0

不确定Ubuntu,但在我的Mac上,python解释器是/Applications/LibreOffice.app/Contents/MacOS中的一部分。 UNO包装生活在同一个文件夹中。这一切都是作为LibreOffice软件包的一部分。 – Jens 2013-07-29 09:48:39

+0

相关:http://stackoverflow.com/questions/24965406/getting-python-to-import-uno-pyuno – Jens 2014-10-09 11:26:28

回答

0

Linux的

dirkjot's answer此主题在Linux上的伟大工程。

的Mac(约塞米蒂)

事情变得有点棘手这里,而随着LibreOffice的4.3我还是不能没有崩溃在Mac致以PYTHONPATH到的LibreOffice和import uno

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

注意如何uno是从LibreOffice的Python路径导入,lxml居住在MacPort的Python路径中。

+0

聪明的解决方案。作为次要评论,我总是会扩展'PYTHONPATH',而不是像你那样设置它。有一天,当你最不期待的时候,你会打破某种东西。 – dirkjot 2015-01-29 09:04:27

+0

@dirkjot:谢谢,好点。我已经更新了答案。 – Jens 2015-01-29 15:04:36

2

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

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

要求是你的LibreOffice/OO Python有相同的版本为你经常一个:Python将编译的.py至.pyc文件,并且格式不版本(至少,这是不是与转让保证)。如果您不确定文件的位置,请执行locate uno.py。检查/usr/bin/libreoffice链接的位置也可能有所帮助。

+0

这在Linux上正常工作,我甚至能够混合Py 3.3和Py 3.4。 (也许我在薄冰上行走,但它迄今为止工作:-)) – Jens 2015-01-16 01:07:44

+0

是的,我在薄冰上行走,它打破了。不要混用Python版本! – Jens 2015-01-29 15:05:24

4

一旦您尝试将PyUNO运行于除LO以外的任何其他python可执行文件之外,情况就会变得很糟糕。

Mac上的SEGV是因为LO的libpyuno.dylib(通过libuno.dylib加载,通过“import uno”加载)引用@ loader_path/LibreOfficePython.framework/Versions/3.3/LibreOfficePython(运行“otool - L“;在当前LO主站上的路径;在各种LO版本上路径有点不同)。当从一个不同的python进程运行而不是LO时,这意味着进程中将会有两个python运行时(并且可能还没有正确初始化LO),并且导致在该LibreOfficePython中的某个SEGV。 (这种情况在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 vars(其目的甚至记录在脚本中)。为了使PyUNO能够从另一个python开始工作,你也需要设置这些环境变量,特别是。 UNO_PATH,URE_BOOTSTRAP以及找到LO特定库的PYTHONPATH部分(而不是python自带的库)。请注意,这些env vars值的详细信息在LO版本中有所不同。

+0

你是说''import uno'在Linux上工作真是愚蠢的运气?如果这是正确的,那么听起来好像使用LO Python并在*之前设置一个*就是一个*? – Jens 2015-02-18 20:54:19

+0

是的,靠运气。 PyUNO的设计目的不是为了使用任意的python安装(它已经足够复杂了,所有的东西都可以使用LO自带的python)。是的,如果您有选择使用哪种python,那么坚持使用lo很可能更容易。 – 2015-02-18 21:44:10

+0

考虑到LO仅带有Python *并且没有任何其他Python工具,似乎遵循[本指南](https://pip.pypa.io/en/latest/installing.html)是关于如何去在LO的Python周围建立一个虚拟环境? – Jens 2015-02-19 00:29:27