2010-09-22 6 views
1

Этот точный вопрос задан раньше, но я нахожусь на своем пути! Я потратил 4 часа, пытаясь заставить SIMPLE Python CGI-скрипт работать в Windows XP, но я получаю ошибки. Пожалуйста, спаси меня!Запустить скрипт CGI Python для Windows XP

Python Script register.py

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

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

Script находится в:
C: \ Program Files \ Apache Software Foundation \ apache2.2 \ CGI-BIN \ сигнализатора

Apache Error Log:

[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» работает! Теперь я озадачен заявлениями о печати. Я попытался напечатать одну и ту же строку из «write» выше, но я получаю обычную ошибку. – Christopher

+0

Я вижу следующее (http://www.faqs.org/docs/diveintopython/kgp_stdio.html) stdout - это файл-подобный объект; вызов его функции записи распечатает любую строку, которую вы ему даете. Фактически, это то, что действительно делает функция печати; он добавляет возврат каретки в конец строки, которую вы печатаете, и вызывает sys.stdout.write. – Christopher

+0

Действительно. Я использовал запись из-за этой точной разницы - запись не добавляет ничего к вашей строке, что позволяет легко определить, что такое фактическая ошибка. –

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-y, поэтому я не уверен на 100%).

+0

(OP использует '-u'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Windows, в противном случае бинарные загрузки/загрузки будут искажены, а Content-Length будет неправильным, что, как правило, приводит к тому, что скрипт вешает таинственно ожидание большего ввода, что неприятно.) – bobince

1

Похоже, что если я использую скотский метод «печать», он работает.

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

Исследование.

Хорошо, теперь ответ очевиден. Python 3.0 сделал «печать» функцией, требующей скобок! Когда я запускаю скрипт из командной строки, он дает идентичную синтаксическую ошибку.

Я на самом деле DID проверил из командной строки несколько раз и печатал. Однако в этот момент я фактически использовал версию 2.5.1 из cygwin. Во время отладки я добавил Python 3.0 к моему пути, и поэтому я запускал скрипт из версии 3.0 с этой точки вперед, а не тестировал из командной строки до сих пор.

Whew! Задача решена. Очень дорогостоящая проблема.

Я ценю вход.Это помогло мне найти решение!

Смежные вопросы