Python CGI Преждевременная ошибка завершения скрипта в зависимости от параметров скрипта - PullRequest
2 голосов
/ 19 апреля 2010

У меня есть скрипт на 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 кода? [/ EDIT]

1 Ответ

1 голос
/ 19 апреля 2010

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

...