在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>") 
+0

谢谢吉姆!使用'sys'方法的作品!我现在对打印报告感到困惑。我试图从'写'上面打印同一行,但我得到了通常的错误。 – Christopher 2010-09-22 03:31:42

+0

我在http://www.faqs.org/docs/diveintopython/kgp_stdio.html看到以下内容:stdout是一个类似文件的对象;调用它的写函数将打印出你给它的任何字符串。事实上,这正是打印功能的真正用处;它将回车添加到要打印的字符串的末尾,并调用sys.stdout.write。 – Christopher 2010-09-22 03:34:34

+0

确实如此。因为这个确切的区别,我使用了写入 - 写入不会将任何内容附加到您的字符串中,因此可以很容易地发现实际的错误。 – 2010-09-22 09:12:43

更改

​​

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

即只插入一个空print你用头完成后, 应该工作对你很好:你指定你在Windows上,所以每个print都会插入标准所需的终止\r\n序列(我相信Apache的容忍“缺失 - '\ r'”问题,这样也可以在Unix-y平台上工作,但我不是100%确定的)。

+0

(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!问题解决了。一个非常耗时的问题。

我很欣赏这个输入。它帮助我找到解决方案!