【问题标题】:Django/Python convert PDF using shell (os.system/Popen) not working in productionDjango / Python使用shell(os.system / Popen)转换PDF在生产中不起作用
【发布时间】:2012-11-07 13:56:25
【问题描述】:

我在 CLI 上使用 libreoffice 在 Django 中将一些文档转换为 PDF。

这是在我看来(并且也在模型上的保存方法中尝试过):

outdir = '/'.join([settings.MEDIA_ROOT, 'pdf'])
command = ['libreoffice', '--headless', '--convert-to', 'pdf', '-outdir', outdir, form.instance.upload.path]
stdout, stderr = subprocess.Popen(command).communicate()

我还尝试使用以下方法代替 subprocess.Popen:

os.system("libreoffice --headless --convert-to pdf --outdir %s %s" % (outdir, instance.upload.path))                                                         

然后我检查一下:

# quick check new file exists                                                                                                                                                
with open("%s/%s.pdf" % (outdir, os.path.splitext(instance.upload.name)[0])): pass

当我通过网站运行它们时,它们只是不起作用——没有生成 PDF 文件。

问题是:这两种方法都在我的本地环境中工作,并且当它们所在的函数从$ python manage.py shell 调用时

问题仅在生产中。

  • Django 1.4
  • Python 2.7.3
  • 服务器版本:Apache/2.2.22 (Ubuntu) 服务器构建时间:2012 年 2 月 13 日 01:51:50 (Rackspace)

请注意,我认为我可能遇到了这个错误:Popen does not work anymore with apache/wsgi and python 2.7.2? ...

虽然格雷厄姆的解决方法如下(我将此添加到我的 apache2.conf )似乎并没有改变任何东西。

WSGIApplicationGroup %{GLOBAL}

我的系统管理员技能不是很好,我可能做错了,我完全被难住了,任何建议或其他尝试或变通方法的指示将不胜感激。

【问题讨论】:

  • 系统管理员常用的调试工具是 strace。

标签: python django apache


【解决方案1】:

mod_wsgi 当从apache2 进程生成时,不会像你在shell 上那样定义$PATH,所以你应该将subprocess.Popen 传递给@ 的absolute 路径名987654325@ 二进制,即/usr/bin/libreoffice,而不仅仅是它的文件名。

【讨论】:

    【解决方案2】:

    您可以将 LibreOffice / OpenOffice uno 模块导入 Python 并避免使用命令行。我一直在写一些更完整的文档,你可以在http://documenthacker.wordpress.com/(或者很快www.documenthacker.com)下载。

    cookbook 部分中有一个将文档转换为 PDF 的示例。

    【讨论】:

    • 请在此处提供问题解决方案,而不是链接到答案
    猜你喜欢
    • 2021-05-21
    • 2012-06-07
    • 2018-09-14
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2017-10-22
    • 2017-08-23
    • 2011-01-07
    相关资源
    最近更新 更多