从 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.pyunohelper.py 的目录的路径作为参数 (/usr/share/pyshared)。

【讨论】:

是的!谢谢你。就我而言,uno.pyunohelper.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 中运行的主要内容,如果未能解决你的问题,请参考以下文章

Unoconv/libreoffice 命令行转换很慢

unoconv 将 .xlsx 文件导出为 png 等图像

使用 Unoconv 将 docx 转换为 pdf 时出错

如何在较新版本的 libreoffice 中使用 unoconv

word文档转html格式在线预览,使用了phpoffice,pydocx,java POI各方案,最终用unoconv解决

无法从 Django 应用程序调用芹菜任务(缺少位置参数)