2011-10-13 10 views
6

Tôi đã tạo hai môi trường python với virtualenv: /usr/local/pythonenv/BASELINE/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?

Trả lời

4

Mod_wsgi của bạn có thể không được biên dịch với Python 2.7. Bạn không thể sử dụng virtualenv cho một phiên bản Python với mod_wsgi được biên dịch dựa trên phiên bản Python khác.

đọc từ:

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

và làm kiểm tra trong tài liệu đó.

+1

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