Python CGI 脚本参数导致提前结束错误
我有一个Python脚本,它应该解析一个文件,然后把一些输出保存到磁盘上,同时返回一个网页,链接到这些输出的文件。当我用HTML表单上传文件运行这个脚本时,我没有得到任何HTML输出,只看到一个500错误页面,错误日志里有这么一行:
[Mon Apr 19 15:03:23 2010] [error] [client 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),结果在错误日志中无论它在脚本的哪个位置,都会出现缩进错误,但“脚本头部提前结束”的错误依然存在。这是不是意味着脚本是完全执行过的?
[编辑]
我现在已经让它工作了,似乎是通过SWIG调用的一个外部C++库出错了,但没有产生有用的错误信息。我已经解决了这个问题,现在脚本正常工作了。
令人惊讶的是,错误日志中唯一的错误是关于脚本头部的,而实际上是某个远程库调用失败了。我想这就是调用非Python代码的风险吧?
[/编辑]
1 个回答
当C语言库出现段错误或者以其他不好的方式退出时,标准输出的缓存可能不会被清空。使用Python解释器的-u
选项或者手动清空缓存可以解决“脚本头部提前结束”的问题,但这并不能解决根本的问题。