Django で Web リクエストを処理しているときに pdftk プロセスを起動し、完了するまで待つ必要があります。私の現在のpdftkコードは次のようになります:
proc = subprocess.Popen(["/usr/bin/pdftk",
"/tmp/infile1.pdf",
"/tmp/infile2.pdf",
"cat", "output", "/tmp/outfile.pdf"])
proc.communicate()
これは、開発サーバー ( user として実行) で実行している限り、正常に機能しますwww-data
。しかし、他に何も変更せずに mod_wsgi に切り替えるとすぐに、コードは でハングしproc.communicate()
、「outfile.pdf」は長さ 0 の開いているファイル ハンドルとして残されます。
サブプロセス呼び出しのいくつかのバリアント(およびプレーンな古いos.system)を試しました-stdin/stdout/stderrをPIPEまたはさまざまなファイルハンドルに設定しても何も変わりません。「shell=True」を使用するproc.communicate()
と、ハングするのを防ぐことができますが、pdftk は、devserver または mod_wsgi の両方で出力ファイルの作成に失敗します。 この議論は、私が理解していないOSシグナルとpdftkで進行中のいくつかのより深いブードゥーがある可能性があることを示しているようです.
このようなサブプロセス呼び出しを wsgi で適切に動作させるための回避策はありますか? PyPDFを使用してpdfファイルを結合することは避けています。これは、メモリが不足するほど多数のファイル(数百)を結合する必要があるためです(PyPDFは、結合中にすべてのソースpdfファイルを開いたままにしておく必要があります)。
最近のUbuntu、pythons 2.6および2.7でこれを行っています。