Как запустить подпроцесс 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, питоны 2.6 и 2.7.