2011-10-13 10 views
6

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?

risposta

4

tuo mod_wsgi è probabile che non compilato con Python 2.7. Non puoi usare un virtualenv per una versione di Python con mod_wsgi compilato su una versione diversa di Python.

Leggi dal:

http://code.google.com/p/modwsgi/wiki/CheckingYourInstallation#Python_Shared_Library

e fare un controllo in quel documento.

+1

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

Problemi correlati