Django或mod_wsgi运行时会修改sys.path吗?

2 投票
1 回答
1593 浏览
提问于 2025-04-16 07:33

我设置了mod_wsgi,并检查它运行得很好。
我还创建了一个简单的django项目,并用以下命令检查它也运行得不错。

django-admin.py runserver --settings=mysite.settings

但是,当我运行下面的wsgi时,

import os
import sys

mysite = '/Users/smcho/Desktop/django/mysite'
if mysite not in sys.path:
    sys.path.insert(0,'/Users/smcho/Desktop/django/mysite')
django = '/Users/smcho/Desktop/django'
if django not in sys.path:
    sys.path.insert(0,'/Users/smcho/Desktop/django')

os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

我遇到了这个错误。

[Wed Nov 24 10:36:45 2010] [error] [client 127.0.0.1] ImportError: Could not import settings 'mysite.settings' (Is it on sys.path? Does it have syntax errors?): No module named mysite.settings

通过用mod_wsgi运行以下python代码,我发现“/Library/Python/2.6/site-packages”在sys.path中。

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World! WSGI working perfectly!\n'*10
    for i in sys.path:
        output += str(i) + '\n'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)

    return [output]

这是我得到的sys.path。它没有包含PYTHONPATH中的路径。

/Library/Python/2.6/site-packages/ply-3.3-py2.6.egg
...
/Library/Python/2.6/site-packages/nose-0.11.4-py2.6.egg
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python26.zip
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-darwin
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/plat-mac/lib-scriptpackages
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-tk
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-old
/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/lib-dynload
/Library/Python/2.6/site-packages 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC
/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/wx-2.8-mac-unicode

所以,我把'mysite'这个django项目复制到了'/Library/Python/2.6/site-packages',现在它运行正常了。

这到底是怎么回事呢?很可能是因为即使我把django项目目录添加到了sys.path中,django并不知道(或者忽略)这个路径以及PYTHONPATH环境变量中的路径。

    sys.path.insert(0,'/Users/smcho/Desktop/django/mysite')
    sys.path.insert(0,'/Users/smcho/Desktop/django')

django在运行时会修改sys.path吗?如果会,怎么防止这种情况?如果不会,为什么django不知道我添加的路径呢?

这是我使用的系统。

OS : Mac OS X 10.6.5
Python : 2.6.1
Django : 1.2.3

问题解决了

请参考我其他的帖子。简单来说,我把我的django项目移动到了可以通过网络访问的www文档目录,一切都正常了。

1 个回答

1

你只检查了'/Users/smcho/Desktop/django/mysite'这个路径是否在sys.path里面,但如果没有的话,你会把它和'/Users/smcho/Desktop/django'这两个路径都加进去。要导入mysite.settings,Python其实需要的是后者,也就是'/Users/smcho/Desktop/django',而不是前者。所以你要确保把这个路径加上。

撰写回答