use*_*461 8 python django subprocess mod-wsgi pdftk
我需要在Django中提供Web请求时启动pdftk进程,并等待它完成.我目前的pdftk代码如下所示:
proc = subprocess.Popen(["/usr/bin/pdftk",
"/tmp/infile1.pdf",
"/tmp/infile2.pdf",
"cat", "output", "/tmp/outfile.pdf"])
proc.communicate()
Run Code Online (Sandbox Code Playgroud)
只要我在开发服务器(以用户身份运行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下做这个.
尝试使用绝对文件系统路径来输入和输出文件.Apache下的当前工作目录与运行服务器不同,可以是任何目录.
消除明显后的第二次尝试.
pdftk程序是一个Java程序,它依赖于能够生成/接收SIGPWR信号以触发垃圾收集或执行其他操作.问题是在守护进程模式下的Apache/mod_wsgi下,信号在请求处理程序线程中被阻塞,以确保它们仅由主线程接收,以查找进程关闭触发器事件.当您要求进程运行pdftk时,遗憾的是从请求处理程序线程继承阻塞的sigmask.这样做的结果是它阻碍了Java垃圾收集过程的操作并导致pdftk以奇怪的方式失败.
唯一的解决方案是使用Celery并让前端向celery队列提交作业,然后分叉并执行pdftk.因为这是从与Apache不同的进程完成的,所以您不会遇到此问题.
有关更多血腥详情,请参阅Google for mod_wsgi和pdftk,尤其是Google网上论坛.
http://groups.google.com/group/modwsgi/search?group=modwsgi&q=pdftk&qt_g=Search+this+group
| 归档时间: |
|
| 查看次数: |
1528 次 |
| 最近记录: |