让python工作,内部服务器错误

时间:2008-12-18 18:53:14

标签: python

我正在尝试从Web浏览器调用Python脚本。我一直收到错误:

500 Internal Server Error

当我检查错误日志时,我看到了消息

Premature end of script headers

这个错误在线的唯一文档说它可能是你的脚本中有不正确的行返回字符的结果,但是我用pico从shell编写了我的测试脚本。此外,当我从命令行运行该文件时,它执行得很好。 “ 到目前为止,我对apache所做的唯一更改是将.py添加到“AddHandler cgi-script”行。

谢谢!


感谢您的快速回复。这是测试代码的最新版本。我按照建议在输出之前添加了几行,但仍然得到相同的错误:

#!/usr/local/bin/python
print "Content-type: text/html\n"
print "\n\n"
print "<HTML>"
print "<HEAD>"
print "<TITLE>Test</TITLE>"
print "</HEAD>"
print "<BODY>"
print "<H2>Hi there.</h2>"
print "</BODY>"
print "</HTML>"

其他一些细节:我正在运行Apache 1.3并且没有mod_python。我设置apache来识别上面提到的.py。我从主public_html文件夹运行脚本。


更新。我放在shebang线上似乎并不重要。我尝试了所有的建议,即使我把它留空,同样的错误也出现在错误日志中,我得到500错误。

我正在安装WHM / Cpanel的linux(red hat 3.4)上运行Apache / 1.3.41。

12 个答案:

答案 0 :(得分:12)

如果您的Python脚本没有设置可执行权限,这就是您将获得的确切行为。

尝试:

chmod a+x foo.py

(其中foo.py是你的脚本名称)。

有关详细信息,请参阅Apache tutorial

答案 1 :(得分:7)

在打印其他内容之前,你在顶部有这样的东西吗?

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

如果您已经拥有此功能,请发布您的代码。

答案 2 :(得分:5)

立即想到两件事。

  1. 确保输出Content-Type: text/html标题
  2. 确保在输出“Hello,world”或其他内容之前在标题后面添加两个换行符(“\ n”)。

答案 3 :(得分:4)

好的最后猜测:

尝试将shebang行改为:

#!/usr/bin/env python

#!/usr/bin/local/env python

了解您的平台/托管服务提供商也很有帮助。

答案 4 :(得分:2)

一个常见错误是错误的路径。我的情况是usr / bin / python。另一个常见错误是不以ASCII模式传输文件。我正在使用WinSCP,您可以在其中轻松设置:转到选项 - &gt;首选项 - &gt;传输 - &gt;单击编辑并将模式更改为文本。

此代码应该有效:

#!/usr/bin/python
print "Content-type: text/html\n\n";
print "<html><head>";
print "<title>CGI Test</title>";
print "</head><body>";
print "<p>Test page using Python</p>";
print "</body></html>";

答案 5 :(得分:2)

如果您已正确配置Apaches httpd文件,则可能由于以下两个原因而收到此错误。请确保这些错误。

  1. 包含'#!/ usr / bin / python'或'#!C:/ Python27 / python'或相应地在您的脚本中作为第一行。
  2. 确保打印后有空格“Content-type:text / html”即。
    print“Content-type:text / html \ n \ n”;
    希望这会有所帮助!!

答案 6 :(得分:1)

您可以通过在Python脚本顶部添加此行来获得更好的错误消息:

import cgitb; cgitb.enable()

此外,标题应该大写Content-Type,而不是Content-type,尽管我怀疑这是否会破坏任何内容。

答案 7 :(得分:0)

听起来像你在Unix机器上使用Windows编写的脚本,而没有先将行结尾从0d0a转换为0a。转换它应该很容易。一种方法是使用你的ftp程序;以ASCII模式传输文件。我与Metapad一起使用的方法是在保存之前使用File-&gt; FileFormat。

答案 8 :(得分:0)

我尝试了很多方法让Python正常使用Apache,最后使用 Apache + mod_WSGI + web.py 解决了这个问题。听起来很多,但它比使用像Django这样复杂的框架要简单得多。

(你是对的,不要打扰mod_python)

注意,我使用的是Apache2,但mod_wsgi也适用于1.3,基于modwsgi page

如果您使用的是Redhat,我相信您有yum,所以请确保获取apache wsgi模块和其他python包:

$ yum update
$ yum install gcc gcc-c++ python-setuptools python-devel
$ yum install httpd mod_wsgi

获取适用于您的python版本的web.py.例如,使用easy_install。我有v2.6。

$ easy_install-2.6 web.py

为您的python脚本创建一个目录:/opt/local/apache2/wsgi-scripts/

在你的httpd.conf中:

LoadModule wsgi_module modules/mod_wsgi.so 

# note foo.py is the python file to get executed 
# and /opt/local/apache2/wsgi-scripts/ is the dedicated directory for wsgi scripts
WSGIScriptAlias /myapp /opt/local/apache2/wsgi-scripts/foo.py/

AddType text/html .py

<Directory /opt/local/apache2/wsgi-scripts/>

    Order allow,deny
    Allow from all
</Directory>

请注意,web.py使用“模板目录”。把它放到wsgi目录/opt/local/apache2/wsgi-scripts/templates/中。

创建文件/opt/local/apache2/wsgi-scripts/templates/mytemplate.html

$def with (text)
<html>
<body>
Hello $text.
</body>
</html>

添加适当的权限。

$ chown -R root:httpd   /opt/local/apache2/wsgi-scripts/
$ chmod -R 770   /opt/local/apache2/wsgi-scripts/

在你的python文件中,foo.py:

import web

urls = ( '/', 'broker',)
render = web.template.render('/opt/local/apache2/wsgi-scripts/templates/')

application = web.application(urls, globals()).wsgifunc()

class broker:
    def GET(self):
        return render.mytemplate("World")

在返回结果之前,上面将用mytemplate中的特殊web.py $ text变量替换为“World”。

http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html

答案 9 :(得分:0)

如果你在Linux网络服务器上有DOS风格的行尾,你也可以得到一些同样的愚蠢。 (这只是我今天早上大约两个小时的咀嚼。)关闭我在这个需要使用的Windows框上更新我的vim.rc。

答案 10 :(得分:0)

我遇到了类似的问题,问题是在打印内容类型后你需要有两个换行符。以下对我有用:

#!/usr/local/bin/python2.6
print('Content-type: text/html\r\n')
print('\r\n')
print('Hello, World!')

答案 11 :(得分:0)

这最终成为我的dos2unix问题。运行dos2unix test.py test.py并成功。 \r\n组合就是问题所在。必须yum install dos2unix进行安装。