在Windows XP上运行Python CGI脚本
这个确切的问题已经被问过,但我在我的智慧结束!我花了4个小时试图让一个简单的Python CGI脚本在Windows XP上工作,但我得到错误。请保存我的理智!在Windows XP上运行Python CGI脚本
的Python脚本register.py
#!c:/Python30/python.exe -u
print "Content-type: text/html"
print "<P>Hello, World!</p>"
脚本位于:
C:\ Program Files文件\ Apache软件基金会\ APACHE2.2 \ cgi-bin目录\警报器
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工作没有问题。
任何想法?谢谢!!!
你的错误是:
脚本过早结束标头
注意,HTTP协议指定一个HTTP响应的主体中分离,从它是由一个空白行标头(即,两个乘以回车和换行)。我会去这样的事情:
import sys
sys.stdout.write("Content-type: text/html\r\n\r\n<p>Body</p>")
更改
到
print "Content-type: text/html"
print
print "<P>Hello, World!</p>"
即只插入一个空print
你用头完成后, 应该工作对你很好:你指定你在Windows上,所以每个print
都会插入标准所需的终止\r\n
序列(我相信Apache的容忍“缺失 - '\ r'”问题,这样也可以在Unix-y平台上工作,但我不是100%确定的)。
(OP使用'-u',所以'print'不会写'\ r' ...尽管对于Apache来说它似乎并不重要。一般来说,你需要在Python CGI中使用'-u' Windows,否则二进制上传/下载将会出现乱码,并且Content-Length将会出错,这通常会导致脚本神秘地挂起来等待更多输入,这是不愉快的。) – bobince 2010-09-22 11:17:13
看来,如果我使用括号的'打印'方法它的作品。
#!C:/Python30/python.exe -u
print("Content-type: text/html\n\n<p>Body</p>")
研究。
好的,现在的答案很明显。 Python 3.0使'打印'功能,需要括号!当我从命令行运行脚本时,它会给出相同的语法错误。
我实际上从命令行DID测试了几次并打印出来。然而,那时我实际上正在使用cygwin的2.5.1版本。在调试过程中,我将Python 3.0添加到了我的路径中,因此我从该版本的3.0版本开始运行脚本,而不是从命令行再次测试。
Whe!问题解决了。一个非常耗时的问题。
我很欣赏这个输入。它帮助我找到解决方案!
谢谢吉姆!使用'sys'方法的作品!我现在对打印报告感到困惑。我试图从'写'上面打印同一行,但我得到了通常的错误。 – Christopher 2010-09-22 03:31:42
我在http://www.faqs.org/docs/diveintopython/kgp_stdio.html看到以下内容:stdout是一个类似文件的对象;调用它的写函数将打印出你给它的任何字符串。事实上,这正是打印功能的真正用处;它将回车添加到要打印的字符串的末尾,并调用sys.stdout.write。 – Christopher 2010-09-22 03:34:34
确实如此。因为这个确切的区别,我使用了写入 - 写入不会将任何内容附加到您的字符串中,因此可以很容易地发现实际的错误。 – 2010-09-22 09:12:43