Только что обновив ПК до Windows 10, появилась странная периодически возникающая ошибка при запуске скрипта Python как cgi под Apache.Конкретный скрипт показывает список доступных модулей Python, вызывая help("modules")
.Иногда сценарий выполняется нормально, но иногда это не удается.Когда происходит сбой, браузер показывает «Внутренняя ошибка сервера», а в журнале ошибок Apache появляется относительно неинформативное сообщение об ошибке «Конец вывода сценария перед заголовками».
Эксперименты показывают, что ошибка возникает примерно в 5 раз изкаждые 20 попыток.
Любопытно, что скрипт всегда выполняется нормально, когда на одном и том же ПК используется Windows 7, и тот же сценарий выполняется нормально (как cgi в Apache) при запуске на сервере Ubuntu.При запуске непосредственно как скрипт Python (без cgi / Apache) он отлично работает даже под Windows 10. Проблема была замечена только в Windows 10 и Apache.
Полный скрипт,называется testX.py, это:
#!/usr/bin/python
# Note the path to Python may vary
#
print "Content-type: text/html\n"
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">";
print ""
print ""
print "Python Test"
print ""
print "Python Test Script - Available Modules"
print ""
help("modules")
print "
"печать""
Технические примечания:
- Сценарий сохраняется вКаталог cgi-bin, обслуживаемый через Apache и просматриваемый с помощью браузера, указывающего на mydomain.com/cgi-bin/testX.py
- Путь к Python не имеет значения в Windows, так как Apache получил директиву
ScriptInterpreterSource Registry
- Если строка
help("modules")
удалена из скрипта, она всегда выполняется нормально - Вызов
help("modules")
из командной строки Python также отлично работает - Apache версии 2.4.33 (32 бита)
- Python версия 2.7.14
- Windows 10 Pro (10.0.17134.81)
Потребовалось некоторое время, чтобы изолировать проблему от комбинации help("modules")
и Windows 10, но кто-нибудь знает, почему это проблема или почему она прерывистая?
ОБНОВЛЕНИЕ
В предыдущие годы велись разговоры о том, что help("modules")
может вызвать ошибку сегментации, что согласуется с наблюдаемым здесь поведением.См. Использование справки и pydoc для отображения списка неработающих модулей Python
Я заменил сомнительный вызов на help("modules")
простой функцией, которая выводит таблицу HTML с использованием pkgutil
:
def help_modules():
from pkgutil import iter_modules
mod_list = []
for thismod in iter_modules():
mod_list.append(thismod[1])
mod_list.sort()
nummods = len(mod_list)
numcols = 6
numblanks = (-nummods) % numcols
mod_list.extend([''] * numblanks)
numrows = len(mod_list) / numcols
print "<TABLE style='width:100%; table-layout: fixed;'>"
for i in range(0,numrows):
print "<TR>"
for j in range(0,numcols):
print "<TD>%s" % (mod_list[i+j*numrows])
print "</TR>"
print "</TABLE>"
return
Теперь все вроде нормально.