2012-11-07 49 views
4

我在CLI上使用libreoffice將一些文檔轉換爲Django中的PDF。Django/Python使用shell(os.system/Popen)在生產中不起作用將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
  • Server版本:阿帕奇/ 2.2.22(Ubuntu的)服務器建:2012年2月13日1點51分50秒(Rackspace公司)

請注意,我想我可能會遇到這個bug:Popen does not work anymore with apache/wsgi and python 2.7.2? ...

雖然格雷厄姆的工作如下(我添加到我的apache2.conf)似乎沒有改變任何東西。

WSGIApplicationGroup %{GLOBAL} 

我的系統管理員的技能都不是很大,雖然,我可能已經這樣做了錯誤的,我完全難倒,任何意見或其他東西來嘗試或迂迴路線,將不勝感激。

+1

系統管理員常見的調試工具是strace。 – jpic

回答

1

mod_wsgiapache2進程產生的時候不會有$PATH定義你有你的外殼,所以你應該通過subprocess.Popen絕對路徑爲libreoffice二進制,即/usr/bin/libreoffice,不只是它的文件名。

0

您可以將LibreOffice/OpenOffice uno模塊導入到Python中,並避免使用命令行。我一直在撰寫一些更完整的文檔,您可以在http://documenthacker.wordpress.com/(或者即將推出www.documenthacker.com)下載這些文檔。

在食譜部分有一個將文檔轉換爲PDF的例子。

+1

請在這裏提供問題解決方案,而不是鏈接到答案 –