刚刚将PC升级到Windows 10时,在Apache下运行Python脚本作为cgi时出现了一个奇怪的间歇性错误。特定脚本通过调用help("modules")
显示可用Python模块的列表。有时脚本执行正常,但有时它会失败。当它失败时,浏览器显示"内部服务器错误"并且Apache错误错误日志具有相对无法提供信息的错误消息"在标题之前输出脚本结束"。
实验表明,每20次尝试中出现错误大约5次。
奇怪的是,当同一台PC使用Windows 7时,脚本总是运行正常,并且当在Ubuntu服务器上运行时,相同的脚本执行正常(在Apache下为cgi)。当直接作为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 "<HTML>"
print "<HEAD>"
print "<TITLE>Python Test</TITLE>"
print "</HEAD>"
print "<H1>Python Test Script - Available Modules</H1>"
print "<P><PRE>"
help("modules")
print "</PRE></P>"
print "</HTML>"
技术说明:
ScriptInterpreterSource Registry
help("modules")
,它总是执行正常help("modules")
也可以正常工作将问题隔离到help("modules")
和Windows 10的组合需要一段时间,但是有谁知道为什么这是一个问题或为什么它是断断续续的?
前几年有人谈到help("modules")
可能导致分段错误,这与此处看到的行为一致。见Using help and pydoc to list python modules not working
我已使用一个简单的函数替换了对help("modules")
的可疑调用,该函数使用pkgutil
输出HTML表格:
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
现在一切似乎都很好。