在现有Python环境中使用pyuno

3 投票
3 回答
5958 浏览
提问于 2025-04-16 07:34

我正在尝试使用PyUNO这个工具,从我的Django服务器里把不同格式的文档(比如doc、wordperfect、html等)转换成PDF格式。不过,我在使用import uno的时候遇到了很多麻烦。具体来说,在执行import pyuno时出现了一个错误,提示ImportError: DLL Load Failed: The specified module could not be found,意思是找不到指定的模块。

目前我能让这个工具正常工作的办法是使用OpenOffice自带的Python 2.6,但我其实想用我自己安装的另一个2.6版本。关于PyUNO的文档都是针对Python 2.2的,而且听说这些文档已经过时了。

我猜可能需要把以下一些文件从OpenOffice的目录复制到我的site-packages目录(或者它的某个子目录)里:

pythonloader.py
pythonloader.uno.ull
pythonloader.uno.ini
pythonscript.py
pyuno.pyd

有没有人成功让这个工具运行起来过?

我是在Windows系统上操作的。

3 个回答

0

我觉得答案是“这不可能。” 从网上其他的资料来看,python.org上编译和链接的python可执行文件所用的标准库(stdlib)和OpenOffice.org分发的python.exe所用的标准库是不一样的。我不知道为什么会这样,而且我对这两个python给我的启动信息是一样的这件事也感到困惑。所以我可能完全走错方向了。

0

我也需要这个问题的答案。我在用Windows XP,系统里有一个从SQL服务器数据库提取数据并插入到模板Excel文件中的程序。我不想在OpenOffice里添加宏之类的东西,但我想用这个服务来生成这些文件。

不过,我似乎只能通过OpenOffice目录里的python.exe来导入uno模块。即便如此,我也无法把这个程序和我系统里的.py文件关联起来,所以每次都得输入完整的路径。

我知道在Linux系统中,Pyuno模块是一个附加组件,可以在普通的Python中使用,但在Windows上似乎不是这样。我已经列出了OpenOffice下python.exe的所有相关路径,并在Python 2.7中复制了一遍,但pyuno还是报错,说找不到某个DLL,而且没有说明具体是哪个DLL。

2

如果只是简单的转换,你不需要重新发明轮子。可以看看 unoconv: http://dag.wieers.com/home-made/unoconv/

如果你的 Python 解释器是和 OpenOffice 一起打包的,或者在某些 Linux 系统中,打包者已经为你做好了很多工作,那么 'import uno' 会自动生效。

替代方案 1: 对于在 Win32 系统上其他的 Python 安装,你需要导入三个环境变量,并在你的 Pythonpath 中添加一个项目。详细教程可以在这里找到:http://user.services.openoffice.org/en/forum/viewtopic.php?f=45&t=36370&p=166783

你必须从安装了 OpenOffice 的 Python 中获取并添加到其他 Python 安装中的三个环境变量是:

  • os.environ['URE_BOOTSTRAP'] = 'vnd.sun.star.pathname:c:\Program Files\OpenOffice.org 3\program\fundamental.ini'
  • os.environ['UNO_PATH'] = 'c:\Program Files\OpenOffice.org 3\program\'
  • os.environ['PATH'].append('c:\Program Files\OpenOffice.org 3\URE\bin;c:\Program Files\OpenOffice.org 3\Basis\program;')

你必须添加到其他 Python 安装中的 Pythonpath 项目是 uno 模块的位置:

  • sys.path.append('C:\Program Files\OpenOffice.org 3\Basis\program')

现在你可以简单地使用 'import uno'。

Pyuno 只和相似版本的 Python 兼容。由于 OpenOffice 3.1 打包了 Python 2.6.1,因此 pyuno 只和另一个 Python 2.6 兼容。如果尝试在不同版本的 Python 中导入 uno,会导致运行时错误。不过在替代方案 2 中有解决办法。

替代方案 2: 对于在 WIN32 系统上其他的 Python 安装,你可以完全忽略 Python-UNO 桥接,改用 Python-COM 桥接。你需要安装一个新的模块,API 有一些不同,但你可以使用任何版本的 Python,包括 Python3。

撰写回答