2008-12-18 21 views
9

Sto cercando di far funzionare gli script Python, chiamati da un browser web. Continuo a ricevere l'errore:Funzionamento di python, Errore interno del server

500 Internal Server Error 

Quando controllo i miei registri degli errori che vedo il messaggio

Premature end of script headers 

L'unica documentazione di questo errore dice on-line che può essere il risultato di avere caratteri di ritorno di linea errata nel tuo script, ma ho scritto il mio script di test direttamente dalla shell con pico. Inoltre, quando eseguo il file dalla riga di comando, viene eseguito correttamente. " Finora l'unico cambiamento che ho fatto per Apache è di aggiungere la .py al 'cgi-script linea AddHandler'.

Grazie!


Grazie per le risposte rapide. Ecco . la versione più recente del codice di prova ho aggiunto un paio di nuove linee prima che l'uscita come suggerito ma ancora ottenere lo stesso errore:

#!/usr/local/bin/python 
print "Content-type: text/html\n" 
print "\n\n" 
print "<HTML>" 
print "<HEAD>" 
print "<TITLE>Test</TITLE>" 
print "</HEAD>" 
print "<BODY>" 
print "<H2>Hi there.</h2>" 
print "</BODY>" 
print "</HTML>" 

Alcuni altri dettagli:. sono in esecuzione di Apache 1.3 e non ho mod_python I imposta apache per riconoscere .py come me indicato sopra. Sto eseguendo lo script dalla cartella public_html principale.


Un aggiornamento. Non sembra importare quello che ho messo nella linea dello shebang. Ho provato tutti i suggerimenti e anche se lo lascio in bianco lo stesso errore si presenta nel registro degli errori e sto ricevendo un errore 500.

Sto eseguendo Apache/1.3.41 su Linux (Red Hat 3.4) con WHM/Cpanel installato.

risposta

5

Mi vengono subito in mente due cose.

  1. Assicurarsi di essere in uscita il Content-Type: text/html intestazione
  2. Assicurarsi che si sta aggiungendo due a capo ("\ n") dopo le intestazioni prima di voi uscita "Ciao, mondo", o qualsiasi altra cosa.
7

avete qualcosa del genere in alto prima di stampare qualcos'altro?

print "Content-type: text/html\n" 

Se si dispone già di questo, quindi inserire il codice.

+0

Due \ n (HTTP richiede una riga vuota dopo le intestazioni) – bortzmeyer

1

Si può anche ottenere un messaggio di errore più con l'aggiunta di questa linea nella parte superiore dello script Python:

import cgitb; cgitb.enable()

Inoltre, l'intestazione deve essere capitalizzata Content-Type, non Content-type, anche se dubito che quel sta rompendo tutto.

+0

Ho aggiunto quella riga all'inizio dello script e in maiuscolo "Tipo", ma continuo a ricevere lo stesso errore e nessuna informazione aggiuntiva. – user47514

+0

Che aspetto ha la tua linea di shebang? E qual è la tua piattaforma? – Triptych

+0

Infatti, la maiuscola non ha importanza per i nomi delle intestazioni. Lo standard HTTP, RFC 2616, dice nel paragrafo 4.2 che intestazioni HTTP hanno la stessa sintassi generale, come le intestazioni di RFC 822. E RFC 822, punto 3.4.7, dice che i nomi di intestazione sono maiuscole e minuscole. – bortzmeyer

11

Questo è il comportamento esatto che si otterrebbe se il proprio script Python non ha il set di autorizzazioni eseguibili.

Prova:

chmod a+x foo.py 

(dove foo.py è il nome dello script).

Vedere Apache tutorial per ulteriori informazioni.

+0

heh, probabilmente ha ragione. Non posso credere che non ci abbia pensato. – Triptych

4

OK ultima ipotesi:

Cercando cambiare quella linea shebang a:

#!/usr/bin/env python 

o

#!/usr/bin/local/env python 

sarebbe anche utile sapere la vostra piattaforma/hosting provider.

+1

Grazie !! @Triptych, mi ha aiutato. :) –

0

Mi sembra che si sta utilizzando uno script scritto in Windows su una macchina Unix , senza prima convertire le terminazioni di linea da 0d0a a 0a. Dovrebbe essere facile convertirlo. Un modo è con il tuo programma ftp; trasferire il file in modalità ASCII. Il modo in cui utilizzo con Metapad è utilizzare File-> FileFormat prima di salvare.

0

ho cercato molti approcci per ottenere Python lavorare con Apache correttamente e finalmente risolta con l'utilizzo di Apache + mod_wsgi + web.py. Sembra molto, ma è molto più semplice che usare i complicati framework come Django là fuori.

(Hai ragione, non perdere tempo con mod_python)

nota, io sto usando Apache2, ma mod_wsgi funziona su 1.3 e, in base alla modwsgi page.

Se siete su Redhat, credo che bisogna yum, in modo da assicurarsi di ottenere il modulo Apache WSGI e altri pacchetti python:

$ yum update 
$ yum install gcc gcc-c++ python-setuptools python-devel 
$ yum install httpd mod_wsgi 

E ottenere web.py per la versione di Python. Ad esempio, utilizzando easy_install. Ho v2.6.

$ easy_install-2.6 web.py 

Creare una directory per gli script python: /opt/local/apache2/wsgi-scripts/

Nel vostro httpd.conf:

LoadModule wsgi_module modules/mod_wsgi.so 

# note foo.py is the python file to get executed 
# and /opt/local/apache2/wsgi-scripts/ is the dedicated directory for wsgi scripts 
WSGIScriptAlias /myapp /opt/local/apache2/wsgi-scripts/foo.py/ 

AddType text/html .py 

<Directory /opt/local/apache2/wsgi-scripts/> 

    Order allow,deny 
    Allow from all 
</Directory> 

Nota che web.py utilizza una "cartella templates". Inseriscilo nella directory wsgi, /opt/local/apache2/wsgi-scripts/templates/.

Creare un file /opt/local/apache2/wsgi-scripts/templates/mytemplate.html:

$def with (text) 
<html> 
<body> 
Hello $text. 
</body> 
</html> 

aggiungere le autorizzazioni appropriate.

$ chown -R root:httpd /opt/local/apache2/wsgi-scripts/ 
$ chmod -R 770 /opt/local/apache2/wsgi-scripts/ 

Nel file python, foo.py:

import web 

urls = ('/', 'broker',) 
render = web.template.render('/opt/local/apache2/wsgi-scripts/templates/') 

application = web.application(urls, globals()).wsgifunc() 

class broker: 
    def GET(self): 
     return render.mytemplate("World") 

È possibile che sostituirà la variabile di testo web.py $ speciale nel MioModello con la parola "mondo" prima di restituire il risultato.

http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.html

0

si può anche ottenere un po 'di questa stessa follia se avete DOS fine stile delle linee su un server linux web. (Che appena masticato circa due ore della mia mattinata di oggi.) Off per aggiornare il mio vim.rc su questa casella finestre che ho bisogno di usare.

0

Ho avuto un problema simile, il problema è che è necessario disporre di due linee di pause dopo la stampa il tipo di contenuto. Di seguito ha lavorato per me:

#!/usr/local/bin/python2.6 
print('Content-type: text/html\r\n') 
print('\r\n') 
print('Hello, World!') 
1

Un errore comune è la strada sbagliata. Il mio caso era usr/bin/python. L'altro errore comune non è il trasferimento del file in modalità ASCII. Sto usando WinSCP dove puoi impostarlo facilmente: vai su Opzioni-> Preferenze-> Trasferisci-> fai clic su Modifica e cambia la modalità in Testo.

Questo codice dovrebbe funzionare:

#!/usr/bin/python 
print "Content-type: text/html\n\n"; 
print "<html><head>"; 
print "<title>CGI Test</title>"; 
print "</head><body>"; 
print "<p>Test page using Python</p>"; 
print "</body></html>"; 
2

Se è stato configurato il file httpd Apache correttamente allora si potrebbe essere sempre questo errore per le seguenti due reasons.Make sicuro che queste siano corrette.

  1. Includi '#!/Usr/bin/python' o '#! C:/Python27/python' o di conseguenza nello script come prima riga.
  2. Assicurarsi che vi sia spazio dopo stampa "Content-Type: text/html", cioè.
    stampa "Content-Type: text/html \ n \ n";
    Spero che questo aiuti !!
+0

Grazie mille. Non posso credere che "1. Includere '#!/Usr/bin/python' ...." può essere una ragione. –

Problemi correlati