8

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でこれを行っています。

4

2 に答える 2

8

入力ファイルと出力ファイルへの絶対ファイル システム パスを使用してみてください。Apache の下の現在の作業ディレクトリは、実行サーバーと同じディレクトリではなく、任意のディレクトリである可能性があります。


明らかなものを排除した後の2回目の試み。

pdftk プログラムは、ガベージ コレクションをトリガーしたり、その他のアクションを実行したりするために、SIGPWR シグナルを生成/受信できることに依存している Java プログラムです。問題は、デーモン モードの Apache/mod_wsgi では、シグナルがリクエスト ハンドラ スレッド内でブロックされ、プロセス シャットダウン トリガー イベントを探しているメイン スレッドによってのみシグナルが受信されるようになっていることです。プロセスを fork して pdftk を実行すると、残念ながらブロックされた sigmask がリクエスト ハンドラ スレッドから継承されます。この結果、Java ガベージ コレクション プロセスの動作が妨げられ、奇妙な方法で pdftk が失敗します。

これに対する唯一の解決策は、Celery を使用し、フロント エンドでジョブを Celery キューに送信して celeryd をフォークし、pdftk を実行することです。これは、Apache とは別に作成されたプロセスから実行されるため、この問題は発生しません。

mod_wsgi と pdftk の詳細については、特に Google グループで Google を参照してください。

http://groups.google.com/group/modwsgi/search?group=modwsgi&q=pdftk&qt_g=Search+this+group

于 2011-09-25T04:33:29.587 に答える