在Windows XP上运行Python CGI脚本
这个问题之前有人问过,但我现在真的快要崩溃了!我花了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 个回答
将
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系统上也应该可以用,不过我不能百分之百确定)。
看起来如果我使用带括号的'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版本的,直到现在才又在命令行测试。
呼!问题解决了。这真是个耗时的问题。
我很感激大家的帮助。这让我找到了解决办法!
你的错误是:
脚本头部提前结束
需要注意的是,HTTP协议规定,HTTP响应的内容和它的头部之间要用一个空行分开(也就是两个换行符)。我建议你可以试试下面的代码:
import sys
sys.stdout.write("Content-type: text/html\r\n\r\n<p>Body</p>")