Python CGI Преждевременная ошибка завершения скрипта в зависимости от параметров скрипта

У меня есть сценарий Python, который должен анализировать файл и производить вывод на диск, а также возвращать веб-страницу, ссылающуюся на выводимые файлы. При запуске с файлом, отправленным из формы HTML, я не получаю вывод HTML, только страница ошибки 500, а error_log содержит строку:

[Пн, 19 апреля 15:03:23 2010] [ошибка] [клиент xxx.xxx.121.79] Преждевременное завершение заголовков скриптов: uploadcml.py, реферер: http://xxx.ch.cam.ac.uk:9000/

Однако файлы, которые должен сохранять скрипт, действительно сохраняются на диск.

Если я запускаю его без каких-либо аргументов, скрипт возвращает правильный HTML-код, указывающий, что файл не был проанализирован.

Вся информация, которую я нашел в Интернете о преждевременных концах заголовков скриптов, подразумевает, что это связано либо с отсутствующим заголовком, либо с отсутствием разрешений на скрипте python, но ни то, ни другое не может относиться ко мне.

Первые строки скрипта:

#!/home/nwe23/bin/bin/python
import cgitb; cgitb.enable()
import cgi
import pybel,openbabel
import random
print "Content-Type: text/html"
print

поэтому при запуске я не вижу способа, чтобы он не смог вывести заголовок, и он выводит заголовок при запуске без файла для анализа, но при наличии файла выдает ошибку (но все же анализирует файл и сохраняет вывод на диск!).

Кто-нибудь знает, как это происходит и что можно сделать, чтобы это исправить?

Я попытался добавить неправильно вставленный тарабарщина (например, foobar) в различных точках файла, и это приводит к добавлению ошибки отступа в error_log, где бы он ни находился, даже если это самая последняя строка в скрипте. Ошибка преждевременного заголовка сценария остается, хотя. Означает ли это, что скрипт выполняется до конца?

[EDIT] Мне удалось заставить его работать сейчас, кажется, что один из вызовов внешней библиотеки C++ через SWIG не удался, но полезного сообщения об ошибке не было. Я исправил проблему с этим, и теперь скрипт работает правильно.

Удивительно, что единственная ошибка в error_log касалась заголовков сценариев, когда произошел сбой при вызове некоторой удаленной библиотеки. Я полагаю, что это опасность вызова не-Python кода? [/РЕДАКТИРОВАТЬ]

1 ответ

Решение

Когда библиотека C получает ошибку сегментации или иным образом завершает работу некорректно, буфер stdout не может быть очищен. С помощью -u опция интерпретатора Python или его сброс вручную должны решить "преждевременный конец заголовков скриптов", но это не поможет с реальной проблемой.

Другие вопросы по тегам