【问题标题】:Python CGI Premature end of script error depending on script parametersPython CGI 脚本过早结束错误取决于脚本参数
【发布时间】:2011-02-09 17:28:33
【问题描述】:

我有一个 python 脚本,它应该解析一个文件并产生一些输出到磁盘,以及返回一个链接到输出文件的网页。当使用从 HTML 表单发布的文件运行时,我没有返回任何 HTML 输出,只有一个 500 错误页面,并且 error_log 包含以下行:

[Mon Apr 19 15:03:23 2010] [error] [client xxx.xxx.121.79] 脚本头过早结束:uploadcml.py,referer: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 的任何位置添加缩进错误,即使它是脚本中的最后一行。不过,过早的脚本标题错误仍然存​​在。这是否意味着脚本一直在执行?

[编辑] 我现在设法让它工作,似乎通过 SWIG 对外部 C++ 库的调用之一失败了,但没有产生有用的错误消息。我已经解决了这个问题,现在脚本可以正常工作了。

令人惊讶的是,当某个远程库调用失败时,error_log 中唯一的错误是关于脚本头的。我想这就是调用非python代码的危险吗? [/编辑]

【问题讨论】:

  • 请尝试重新格式化您的问题。还可以尝试向您的应用程序添加一些日志记录(到文件、系统日志等)。您可以使用logging 模块。
  • 对,我已经习惯了将 python 脚本的输出用作记录器,如果没有,这有点没用。使用日志记录模块表明问题似乎是对外部库的调用,该库必须抛出一些异常。为什么这会导致该点之前的脚本生成的 HTML 无法输出?
  • 您是否创建内容长度?发送数据时似乎也需要这样做。
  • 您可以随时使用 `cgitb.enable(logdir=..., format="text") 获取更多信息。

标签: python cgi openbabel


【解决方案1】:

当 C 库出现分段错误或以其他方式退出时,标准输出缓冲区可能不会被刷新。使用 Python 解释器的 -u 选项或手动刷新它应该可以解决“脚本头过早结束”,但它对实际问题没有帮助。

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 2012-06-09
    • 2012-06-25
    • 2012-04-07
    • 2021-12-03
    • 2011-03-19
    • 2012-12-03
    • 1970-01-01
    • 2017-07-22
    相关资源
    最近更新 更多