从django应用程序调用unoconv时出现的问题,在virtualenv中运行
我有一个django应用程序使用子进程调用unoconv。 在我的开发环境中运行时,它工作正常,但在生产环境中运行时出错。
它给出了这个错误
“unoconv:在/ usr / lib / libreoffice中找不到合适的pyuno库和python二进制组合错误:没有名为uno的模块
unoconv:无法在您的系统上找到合适的办公室安装。 错误:请找到您的办公室安装并将您的反馈发送到:http://github.com/dagwieers/unoconv/issues“
但unoconv从命令行运行得很好。
由于我将django应用程序作为uwsgi vassal运行,它可能与特权有关,尽管对于我来说我无法弄清楚如何解决它。
PS - django应用程序不会启动unoconv侦听器,其中一个已经在运行。
编辑 - 这不是一个权限问题,而是一个路径问题unoconv被从错误的python解释器(virtualenv之一)调用,
由于该应用程序在virtualenv中运行,因此unoconv正在使用virtualenv python解释器而不是系统调用。
如果你有virtualenvwrapper,修正很简单 - 只需调用带有包含uno.py
和unohelper.py
作为参数( /usr/share/pyshared
)的路径的add2virtualenv
命令即可。
你确定你绝对需要unoconv你的用例吗? 它功能强大,但由于它需要一个完整的LibreOffice来运行,它是:1)转换文件有点慢; 2)启动缓慢; 3)使用大量的RAM; 4)不可扩展性。
你为什么不尝试Apache Tika(基于Apache POI)? 对于大多数日常任务而言,它稍微轻巧一点,足以胜任。
启动Tika来处理PDF文件,或使用魔术来区分文件类型,并使用单独的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
PS unoconv: Cannot find a suitable pyuno library and python binary combination
错误unoconv: Cannot find a suitable pyuno library and python binary combination
可能与很多问题有关。 没有你提供额外的信息是不可能的。 例如,它可能是路径问题。
请务必查看相关的unoconv
故障排除指南:
Python和pyuno不兼容;
故障排除说明
上一篇: Problems with calling unoconv from a django app, running in an virtualenv