我需要在 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 下创建输出文件。 这个讨论似乎表明操作系统信号和 pdftk 可能存在一些我不理解的更深层次的巫术。
是否有任何解决方法可以让这样的子进程调用在 wsgi 下正常工作?我避免使用 PyPDF 来合并 pdf 文件,因为我必须合并足够多的文件(数百个)以致内存不足(PyPDF 需要在合并时保持每个源 pdf 文件在内存中打开)。
我在最近的 Ubuntu、pythons 2.6 和 2.7 下这样做。