【问题标题】:Internal Server Error 500 - Python, CGI内部服务器错误 500 - Python、CGI
【发布时间】:2011-10-09 09:04:27
【问题描述】:

我的 .py 文件在终端中执行正常,但在浏览器中出现此错误

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
...
...

这是 .py 文件:

#!/usr/bin/python
import cgi
import cgitb; cgitb.enable()
print "Content-Type: text/html\n\n"     # HTML is following
print                                   # blank line, end of headers

print "<TITLE>CGI script output</TITLE>"
print "<H1>This is my first CGI script</H1>"
print "Hello, world!"

我应该将其保存为 .cgi 文件吗?我尝试过同样的错误,我尝试了很多这样的文件,但没有一个工作,我确信 apache 服务器正在工作,因为有其他 .cgi 脚本从同一目录运行而没有问题。

我也试过: #!/usr/local/bin/python & #!/usr/bin/local/python

任何帮助表示赞赏。

编辑 错误日志输出: (2) 没有这样的文件或目录: '.../.../.../test.py' 的执行失败 脚本头过早结束:test.py

【问题讨论】:

  • 正确的#!/usr/bin/env python 怎么样?你为什么要使用 CGI?它已被弃用。编辑:如果您必须使用 CGI 来提供脚本,我建议您通过 CGI 提供 WSGI 应用程序。
  • 是的,我试过 /env python。 CGI 看起来很容易设置,并且在某种程度上,我已经编写了很多 python 代码
  • WSGI 更加简单,并且易于移植。看看 Flask 或 Bottle 框架。
  • 发布相关的 Apache 配置部分和 error.log 行
  • 错误日志显示行过早结束?

标签: python cgi


【解决方案1】:

这是我不久前写的。这些是解决 Python CGI 问题时需要注意的一些好东西。

有一些技巧可以让 Python 在 CGI 中工作。

Apache 设置:这可能是旧的

通过在配置中修改以下内容将python添加为CGI:

    Options Indexes FollowSymLinks ExecCGI
    AddHandler cgi-script .cgi .py
  1. 始终通过 Apache 浏览页面。 请注意,通过浏览器查看文件系统中的文件适用于 html 页面上的大多数内容,但不适用于 CGI。为了使脚本工作,它们必须通过 htdocs 文件系统打开。浏览器的地址行应如下所示:

    \\127.0.0.1\index.html or
    \\localhost\index.html
    

    如果您通过文件系统打开文件,CGI 将无法工作。例如,如果这是在浏览器的地址栏中:

    c:\Apache\htdocs\index.html (or some other example location)
    
  2. 将脚本行尾转换为 Unix 格式: 大多数编辑器都有“显示行尾”选项,然后是从 Unix 转换为 PC 格式的工具。您必须将行尾设置为 Unix 格式。

  3. 在 CGI 脚本的第一行说明 Python 解释器的路径: 您的 Python CGI 脚本的第一行必须包含以下行之一:

    #!C:\Python25\Python.exe
    #!/usr/bin/python
    

    顶行用于在 PC 上调试时使用,底行用于服务器,例如 1and1。我将这些行保留为如图所示,然后在它们在服务器上启动后通过删除第一行来编辑它们。

  4. 在打印任何其他输出之前打印指定 HTML 的内容类型: 这可以通过在脚本中很早的位置添加以下行来完成:

    print "Content-Type: text/html\n\n"
    

    请注意,需要 2 个行尾。

  5. 设置 Python 脚本以提供调试信息: 导入以下内容以获取详细的调试信息。

    import cgitb; cgitb.enable()
    

    如果 cgitb 不可用,另一种方法是执行以下操作:

    import sys
    sys.stderr = sys.stdout
    
  6. 在服务器上,python 脚本权限必须设置为执行。 上传文件后,请务必编辑第一行并设置要执行的文件的权限。

检查是否可以直接点击 python 脚本。如果不能,请按照上述步骤 (2-6) 进行修复。然后当 Python 脚本运行时,调试 shtml。

【讨论】: