在Windows XP上运行Python CGI脚本

1 投票
3 回答
3682 浏览
提问于 2025-04-16 04:26

这个问题之前有人问过,但我现在真的快要崩溃了!我花了4个小时想让一个简单的Python CGI脚本在Windows XP上运行,但总是出错。求求你们帮我解救一下!

Python脚本:register.py

#!c:/Python30/python.exe -u

print "Content-type: text/html" 
print "<P>Hello, World!</p>"

脚本的位置在:
C:\Program Files\Apache Software Foundation\Apache2.2\cgi-bin\alerter

Apache错误日志:

[Tue Sep 21 19:06:36 2010] [error] [client 127.0.0.1] Premature end of script headers: register.py
[Tue Sep 21 19:06:36 2010] [error] [client 127.0.0.1]   File "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin/alerter/register.py", line 3\r
[Tue Sep 21 19:06:36 2010] [error] [client 127.0.0.1]     print "Content-type: text/html"\r
[Tue Sep 21 19:06:36 2010] [error] [client 127.0.0.1]                                   ^\r
[Tue Sep 21 19:06:36 2010] [error] [client 127.0.0.1] SyntaxError: invalid syntax\r

httpd.conf:

LoadModule cgi_module modules/mod_cgi.so

<Directory "C:/Program Files/Apache Software Foundation/Apache2.2/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    Options +ExecCGI
    AddHandler cgi-script .py
</Directory>

这应该是非常简单的,对吧?我一定是漏掉了某个关键的东西,才导致它一直无法运行。我之前让PHP运行得很好,没遇到问题。

有什么建议吗?谢谢!!!

3 个回答

0

print "Content-type: text/html" 
print "<P>Hello, World!</p>"

改成

print "Content-type: text/html" 
print
print "<P>Hello, World!</p>"

也就是说,在你处理完头部信息后,插入一个空的 print 就可以了。这样做是没问题的:你提到你是在Windows系统上,所以每个 print 都会自动加上标准要求的结束符 \r\n(我记得Apache对“缺少'\r'”的问题是比较宽容的,所以在类Unix系统上也应该可以用,不过我不能百分之百确定)。

1

看起来如果我使用带括号的'print'方法,它就能正常工作。

#!C:/Python30/python.exe -u
print("Content-type: text/html\n\n<p>Body</p>")

正在研究中。

好吧,现在答案显而易见了。Python 3.0把'print'变成了一个函数,这就要求必须加上括号!当我从命令行运行这个脚本时,它也给了我同样的语法错误。

其实我之前确实在命令行测试过好几次,它是可以打印的。不过,那时候我用的是cygwin的2.5.1版本。在调试的时候,我把Python 3.0加到了我的路径中,所以从那时起我运行的脚本就是3.0版本的,直到现在才又在命令行测试。

呼!问题解决了。这真是个耗时的问题。

我很感激大家的帮助。这让我找到了解决办法!

4

你的错误是:

脚本头部提前结束

需要注意的是,HTTP协议规定,HTTP响应的内容和它的头部之间要用一个空行分开(也就是两个换行符)。我建议你可以试试下面的代码:

import sys
sys.stdout.write("Content-type: text/html\r\n\r\n<p>Body</p>")

撰写回答