在现有Python环境中使用pyuno
我正在尝试使用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 个回答
我觉得答案是“这不可能。” 从网上其他的资料来看,python.org上编译和链接的python可执行文件所用的标准库(stdlib)和OpenOffice.org分发的python.exe所用的标准库是不一样的。我不知道为什么会这样,而且我对这两个python给我的启动信息是一样的这件事也感到困惑。所以我可能完全走错方向了。
我也需要这个问题的答案。我在用Windows XP,系统里有一个从SQL服务器数据库提取数据并插入到模板Excel文件中的程序。我不想在OpenOffice里添加宏之类的东西,但我想用这个服务来生成这些文件。
不过,我似乎只能通过OpenOffice目录里的python.exe来导入uno模块。即便如此,我也无法把这个程序和我系统里的.py文件关联起来,所以每次都得输入完整的路径。
我知道在Linux系统中,Pyuno模块是一个附加组件,可以在普通的Python中使用,但在Windows上似乎不是这样。我已经列出了OpenOffice下python.exe的所有相关路径,并在Python 2.7中复制了一遍,但pyuno还是报错,说找不到某个DLL,而且没有说明具体是哪个DLL。
如果只是简单的转换,你不需要重新发明轮子。可以看看 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。
- 安装 pywin32 模块以获取 COM 访问权限:http://sourceforge.net/projects/pywin32/
- 关于 API 差异的讨论:http://user.services.openoffice.org/en/forum/viewtopic.php?f=45&t=36608&p=168179