Мне нужно запустить процесс pdftk при обслуживании веб-запроса в Django и дождаться его завершения. Мой текущий код pdftk выглядит так:
proc = subprocess.Popen(["/usr/bin/pdftk",
"/tmp/infile1.pdf",
"/tmp/infile2.pdf",
"cat", "output", "/tmp/outfile.pdf"])
proc.communicate()
Это отлично работает, пока я работаю на сервере разработки (под пользователем 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.