从 django 应用程序调用 unoconv 的问题,在 virtualenv 中运行
Posted
技术标签:
【中文标题】从 django 应用程序调用 unoconv 的问题,在 virtualenv 中运行【英文标题】:Problems with calling unoconv from a django app, running in an virtualenv 【发布时间】:2013-10-05 11:58:32 【问题描述】:我有一个使用子进程调用 unoconv 的 django 应用程序。在我的开发环境中运行正常,但在生产环境中运行时出错。
它给出了这个错误
"unoconv: 在 /usr/lib/libreoffice 中找不到合适的 pyuno 库和 python 二进制组合 错误:没有名为 uno 的模块
unoconv:在您的系统上找不到合适的办公室安装。 错误:请找到您的办公室安装并将您的反馈发送至: http://github.com/dagwieers/unoconv/issues"
但是 unoconv 从命令行运行得很好。
由于我将 django 应用程序作为 uwsgi vassal 运行,它可能与特权有关,但我终其一生都无法弄清楚如何解决它。
PS - django 应用程序没有启动 unoconv 侦听器,那里已经在运行。
编辑 - 这不是权限问题,而是路径问题,因为 unoconv 是从错误的 Python 解释器(virtualenv 解释器)调用的
【问题讨论】:
【参考方案1】:由于应用程序在 virtualenv 中运行,因此使用 virtualenv python 解释器而不是系统解释器调用 unoconv。
如果你有 virtualenvwrapper,修复非常简单 - 只需调用 add2virtualenv
命令,在我的例子中,使用包含 uno.py
和 unohelper.py
的目录的路径作为参数 (/usr/share/pyshared
)。
【讨论】:
是的!谢谢你。就我而言,uno.py
和 unohelper.py
位于“系统站点包目录”(/usr/lib/python3/dist-packages
)中,如 virtualenvwrapper 文档中所述。如果它可以帮助任何人:)
嗨 elssar,我遇到了完全相同的问题。你能更具体地描述一下修复吗?我无法理解 virtualenvwrapper 部分。【参考方案2】:
你确定你的用例绝对需要unoconv吗?它很强大,但是因为它需要一个成熟的 LibreOffice 才能运行,所以它是:1)转换有点慢文件; 2)启动缓慢; 3) 使用大量内存; 4) 不是很可扩展。
你为什么不试试Apache Tika(它基于Apache POI)?它更轻量级,对于大多数日常任务来说已经足够了。
启动 Tika 也可以处理 PDF 文件,或使用 magic 区分文件类型并使用单独的 pdftotext 实用程序或类似工具。以下是可用于将办公文件转换为文本的简化版本:
import subprocess
from django.db import models
import magic # https://github.com/ahupp/python-magic
PDFTOTEXT_COMMAND = '/usr/bin/pdftotext'
JAVA_COMMAND = '/usr/bin/java'
TIKA_PATH = '/path/to/tika.jar'
PDFTOTEXT_OPTIONS = [u'-', ]
JAVA_OPTIONS = [ u'-jar', TIKA_PATH, u'--text', ]
mime = magic.Magic(mime=True)
class UploadedFileModel(models.Model):
file = models.FileField(upload_to='files/')
def get_txt(self):
if not ('application/pdf' in mime.from_file(
self.file.path.encode('utf-8'))):
option_list = [JAVA_COMMAND, ] + JAVA_OPTIONS + [self.file.path, ]
else:
option_list = [PDFTOTEXT_COMMAND, ] + [self.file.path, ] +\
PDFTOTEXT_OPTIONS
pipe = subprocess.Popen(option_list, stdout=subprocess.PIPE)
txt = pipe.communicate()[0]
if pipe.returncode:
return None
else:
return txt
附言
错误unoconv: Cannot find a suitable pyuno library and python binary combination
可能与许多问题有关。如果您不提供其他信息,就无法确定。例如,paths 可能有问题。
请务必查看相关的unoconv
故障排除指南:
Python and pyuno incompatibilities;
Troubleshooting instructions.
【讨论】:
是的,我们确实需要 unoconv。到目前为止,性能问题在开发中一直不是问题,并且认为它们不会成为生产中的问题。另外,找出导致错误的原因,这是virtualenv的问题。感谢您的建议 @elssar,谢谢! IMO,您应该创建自己的答案并接受它,您也应该编辑问题的标题并排除 running as uwsgi vassal 以帮助其他人,如果他们偶然发现相同的问题来实际找到您的答案。在生产环境中处理unoconv
时,请务必合并多次重试,因为 libreoffice 偶尔会崩溃并且需要时间来预热实例。顺便说一句,知道为什么你特别需要unoconv
会很有趣。
另外,根据您的说法,这似乎是 python
路径的问题,而事实上调用 unoconv
时考虑了错误的 python
解释器(来自 @ 987654337@而不是系统一)。确实是路径问题。【参考方案3】:
尝试在你的 linux 终端中添加这个(激活环境后)URE_BOOTSTRAP=vnd.sun.star.pathname:/usr/lib64/libreoffice/program/fundamentalrc
UNO_PATH=/usr/lib64/libreoffice/program
PATH=/usr/lib64/libreoffice/program:/home/graaff/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.5.3:/opt/android-sdk-update-manager/tools:/opt/android-sdk-update-manager/platform-tools:/usr/games/bin
,或者至少尝试 UNO_PATH 和 PATH
【讨论】:
【参考方案4】:我在使用虚拟环境时遇到了这个问题。
cp /usr/lib/python3/dist-packages/unohelper.py /path/to/env/lib/python3.6/site-packages/
cp /usr/lib/python3/dist-packages/uno.py /path/to/env/lib/python3.6/site-packages/
【讨论】:
以上是关于从 django 应用程序调用 unoconv 的问题,在 virtualenv 中运行的主要内容,如果未能解决你的问题,请参考以下文章
如何在较新版本的 libreoffice 中使用 unoconv
word文档转html格式在线预览,使用了phpoffice,pydocx,java POI各方案,最终用unoconv解决