Мне нужно запустить процесс 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.