2010-09-22 141 views
1

這個確切的問題已經被問過,但我在我的智慧結束!我花了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工作沒有問題。

任何想法?謝謝!!!

回答

4

你的錯誤是:

腳本過早結束標頭

注意,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

0

更改

​​

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

1

看來,如果我使用括號的'打印'方法它的作品。

#!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!問題解決了。一個非常耗時的問題。

我很欣賞這個輸入。它幫助我找到解決方案!