我有一个使用子进程调用unoconv的django应用程序。我在开发环境中运行时工作正常,但在生产环境中运行时出错。
它给出了这个错误
“unoconv:在/ usr / lib / libreoffice中找不到合适的pyuno库和python二进制组合错误:没有名为uno的模块
unoconv:在您的系统上找不到合适的办公室安装。错误:请找到您的办公室安装并将您的反馈发送至:http://github.com/dagwieers/unoconv/issues“
但unoconv从命令行运行得很好。
由于我将django应用程序作为uwsgi附庸运行,它可能与特权有关,但对于我的生活,我无法弄清楚如何解决它。
PS - django应用程序没有启动unoconv监听器,其中一个已经运行。
编辑 - 这不是一个权限问题,但是从错误的python解释器(virtualenv one)调用unoconv的路径问题
由于应用程序在virtualenv中运行,因此使用virtualenv python解释器而不是系统解释器来调用unoconv。
如果你有virtualenvwrapper,修复非常简单 - 在我的情况下,只需调用add2virtualenv
命令,该命令包含uno.py
和unohelper.py
作为参数(/usr/share/pyshared
)的目录。
你确定你的用例绝对需要unoconv吗?它功能强大,但由于它需要一个完整的LibreOffice才能运行,它是:1)转换文件有点慢; 2)开始慢; 3)使用大量RAM; 4)不是很可扩展。
你为什么不试试Apache Tika(基于Apache POI)?对于大多数日常任务而言,它更轻巧,更加足够好。
启动Tika也可以处理PDF文件,或使用magic来区分文件类型,并使用单独的pdftotext实用程序或类似的东西。以下是可用于将office文件转换为文本的简化版本:
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
故障排除指南:
只需尝试在你的linux终端中添加它(激活环境后)qazxsw poi,或至少尝试UNO_PATH和PATH