Tôi đã tạo hai môi trường python với virtualenv: /usr/local/pythonenv/BASELINE
và /usr/local/pythonenv/django1
. Cả hai đều được tạo với --no-site-packages. Tôi đã cài đặt django vào môi trường django1 bằng easy_install.python không thể nhập từ thư viện chuẩn
tập tin wsgi.conf của tôi có dòng này để thiết lập các thông dịch Python:
WSGIPythonHome /usr/local/pythonenv/BASELINE
tập tin django.wsgi của tôi bắt đầu như:
import site
site.addsitedir('/usr/local/pythonenv/django1/lib/python2.7/site-packages')
import os
import sys
Nhưng khi tôi cố gắng truy cập trang web của tôi, tôi nhận được Lỗi 500 và httpd/error_log chứa:
[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
Tôi mất lý do tại sao trình thông dịch Python không thể nhập n thư viện chuẩn. Tôi thậm chí không chắc chắn làm thế nào để kiểm tra xem httpd là ngay cả khi sử dụng các thông dịch viên trong/usr/local/pythonenv/BASELINE, do đó, đó sẽ là một khởi đầu tốt.
Chỉnh sửa: Không liên quan nhưng tôi đã khá rách về việc liệu tôi có nên đăng bài này tại đây hoặc lên ServerFault hay không. Lời khuyên về phía trước được đánh giá cao.
Chỉnh sửa: Vì vậy, tôi đã có thể nhận được một số thông tin gỡ lỗi nhờ http://code.google.com/p/modwsgi/wiki/DebuggingTechniques. Tôi đã thay đổi tập lệnh django.wsgi của mình thành chứa
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]
Điều này đặt thông tin trình thông dịch Python vào/var/log/httpd/error_log. Đầu ra lỗi:
[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
Vì vậy, sys.path và sys.executable point cho vấn đề của tôi. Vì một số lý do sys.path đang sử dụng một số tệp lib không tồn tại (BASELINE thậm chí không chứa thư mục lib64 và nó được tạo bằng Python2.7) và sys.executable cho thấy mod_wsgi vẫn đang chạy mặc định/usr/thông dịch viên bin/python, không phải là thông dịch viên trong/usr/local/pythonenv/BASELINE/bin.
Không chắc chắn tại sao lại xảy ra trường hợp này, nhưng ít nhất tôi biết nhiều hơn một chút.
EDIT: Điều này được giải quyết, nhưng Django vẫn liệt kê "Python thực thi:/usr/bin/python" mặc dù nó phải là (và theo như tôi có thể nói, đó là, kể từ phiên bản Python: 2.7.2) sử dụng/usr/local/bin/python. Điều này có bình thường không?
Vâng, đây là vấn đề. Tôi nghĩ tôi đã biên dịch mod_wsgi với Python 2.7 vì tôi chạy ./configure --with-python =/usr/local/bin/python và sau đó đã thực hiện và cài đặt, nhưng điều này không hiệu quả vì tôi vẫn còn các đối tượng cũ ngồi đó Tôi phải làm sạch, sau đó đi qua trình tự xây dựng. – sans