Как запустить подпроцесс pdftk в wsgi?

Мне нужно запустить процесс pdftk при обслуживании веб-запроса в Django и дождаться его завершения. Мой текущий код pdftk выглядит так:

proc = subprocess.Popen(["/usr/bin/pdftk", 
                         "/tmp/infile1.pdf", 
                         "/tmp/infile2.pdf", 
                         "cat", "output", "/tmp/outfile.pdf"])    
proc.communicate()

Это работает нормально, пока я выполняю под dev-сервером (запущенным от имени пользователя 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.

8
задан Eevee 2 March 2013 в 10:09
поделиться