【发布时间】:2011-11-24 12:00:13
【问题描述】:
我需要在 Django 中为 Web 请求提供服务时启动一个 pdftk 进程,然后等待它完成。我当前的 pdftk 代码如下所示:
proc = subprocess.Popen(["/usr/bin/pdftk",
"/tmp/infile1.pdf",
"/tmp/infile2.pdf",
"cat", "output", "/tmp/outfile.pdf"])
proc.communicate()
只要我在开发服务器下执行(以用户www-data 身份运行),它就可以正常工作。但是,一旦我切换到 mod_wsgi,不做任何更改,代码就会挂在proc.communicate(),并且“outfile.pdf”被保留为长度为零的打开文件句柄。
我已经尝试了子进程调用的几种变体(以及普通的旧 os.system)——将 stdin/stdout/stderr 设置为 PIPE 或各种文件句柄没有任何改变。使用 "shell=True" 可以防止 proc.communicate() 挂起,但是 pdftk 无法在 devserver 或 mod_wsgi 下创建输出文件。 This discussion 似乎表明操作系统信号和 pdftk 可能存在一些我不理解的更深层次的巫术。
是否有任何解决方法可以让这样的子进程调用在 wsgi 下正常工作?我避免使用 PyPDF 来合并 pdf 文件,因为我必须合并足够多的文件(数百个)以致内存不足(PyPDF 需要在合并时保持每个源 pdf 文件在内存中打开)。
我在最近的 Ubuntu,python 2.6 和 2.7 下这样做。
【问题讨论】:
标签: python django subprocess mod-wsgi pdftk