Ho creato due ambienti python con virtualenv: /usr/local/pythonenv/BASELINE
e /usr/local/pythonenv/django1
. Entrambi sono stati creati con --no-site-packages. Ho installato django nell'ambiente django1 con easy_install.mod_wsgi python non può importare dalla libreria standard
Il mio file wsgi.conf ha questa linea per impostare l'interprete Python:
WSGIPythonHome /usr/local/pythonenv/BASELINE
Il mio file django.wsgi inizia così:
import site
site.addsitedir('/usr/local/pythonenv/django1/lib/python2.7/site-packages')
import os
import sys
Ma quando provo a visitare il mio sito, ho ottiene un errore 500, e httpd/error_log contiene:
[error] Traceback (most recent call last):
[error] File "/service/usr/local/django_apps/apache/django.wsgi", line 1, in ?
[error] import site
[error] ImportError: No module named site
sono perduto il motivo per cui l'interprete Python non può importare la sua ow n libreria standard. Non sono nemmeno sicuro di come controllare se httpd sta utilizzando l'interprete in/usr/local/pythonenv/BASELINE, quindi sarebbe un buon inizio.
Edit: non correlati ma ero abbastanza strappato su se devo pubblicare questo qui o per ServerFault. I consigli su questo fronte sono apprezzati.
Edit: Così mi è stato in grado di ottenere alcune informazioni di debug grazie alla http://code.google.com/p/modwsgi/wiki/DebuggingTechniques. Ho cambiato il mio script django.wsgi per contenere
import sys
def application(environ, start_response):
status = '200 OK'
output = 'Hello World!'
print >> environ['wsgi.errors'], sys.path
print >> environ['wsgi.errors'], sys.prefix
print >> environ['wsgi.errors'], sys.executable
response_headers = [('Content-type', 'text/plain'), ('Content-Length', str(len(output)))]
start_response(status, response_headers)
return [output]
Questo ha messo le informazioni interprete Python in/var/log/httpd/error_log. L'output dell'errore:
[error] ['/usr/local/pythonenv/BASELINE/lib64/python24.zip', '/usr/local/pythonenv/BASELINE/lib64/python2.4/', '/usr/local/pythonenv/BASELINE/lib64/python2.4/plat-linux2', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-tk', '/usr/local/pythonenv/BASELINE/lib64/python2.4/lib-dynload']
[error] /usr/local/pythonenv/BASELINE
[error] /usr/bin/python
Quindi sys.path e sys.executable puntano al mio problema. Per qualche ragione sys.path usa alcuni file lib che non esistono (BASELINE non contiene nemmeno una directory lib64, ed è stato creato con Python2.7), e sys.executable mostra che mod_wsgi sta ancora utilizzando il default/usr/interprete bin/python, non l'interprete in/usr/local/pythonenv/BASELINE/bin.
Non capisco perché questo è il caso, ma almeno so che un po 'di più ora.
EDIT: Questo è risolto, ma Django elenca ancora "Python Executable:/usr/bin/python" anche se dovrebbe essere (e per quanto posso dire, lo è, dal momento che Python versione: 2.7.2) usando/usr/local/bin/python. È normale?
Sì, questo era il problema. Ho pensato di aver compilato mod_wsgi contro Python 2.7 perché ho eseguito ./configure --with-python =/usr/local/bin/python e poi ho fatto make e make install, ma questo non ha funzionato perché avevo ancora i vecchi oggetti seduto lì. Ho dovuto pulire, quindi passare attraverso la sequenza di build. – sans