mod_wsgi 找不到我的 Python 包?

3 投票
2 回答
3725 浏览
提问于 2025-04-17 09:43

我的Django应用在Apache/mod_wsgi中加载时,找不到我的外部包,尽管我已经在sys.path中指定了它们?

具体情况如下:

a) 外部包放在 /var/www/site/my/python/config 目录下

b) Django网站(包含settings.py文件)放在 /var/www/site/domain 目录下

c) wsgi配置文件是:

import os, sys
sys.stdout = sys.stderr

# Add the virtual Python environment site-packages directory to the path
import site
site.addsitedir('/var/www/virtualenv/lib/python2.6/site-packages')

# Avoid ``[Errno 13] Permission denied: '/var/www/.python-eggs'`` messages
os.environ['PYTHON_EGG_CACHE'] = '/var/www/egg-cache'

# Add project directory to PYTHONPATH
sys.path.append('/var/www/site') # <---- THIS SHOULD FIND EXTERNAL PACKAGES?
os.environ['DJANGO_SETTINGS_MODULE'] = 'domain.settings'

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

d) settings.py文件的开头是这样的:

print "prior to import"
from my.python.config import ConfigParser # <---- THIS EXIST AS INDICATED IN a), but fails!
print after to import"

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    # ('Your Name', 'your_email@example.com'),
)

MANAGERS = ADMINS

....

我遇到的错误是:

prior to import
mod_wsgi (pid=3465): Exception occurred processing WSGI script '/var/www/mod_wsgi/django.wsgi'.
Traceback (most recent call last):
   File "/var/www/virtualenv/lib/python2.6/site-packages/django/core/handlers/wsgi.py", line 250, in __call__
  self.load_middleware()
   File "/var/www/virtualenv/lib/python2.6/site-packages/django/core/handlers/base.py", line 39, in load_middleware
     for middleware_path in settings.MIDDLEWARE_CLASSES:
   File "/var/www/virtualenv/lib/python2.6/site-packages/django/utils/functional.py", line 276, in __getattr__
     self._setup()
   File "/var/www/virtualenv/lib/python2.6/site-packages/django/conf/__init__.py", line 42, in _setup
     self._wrapped = Settings(settings_module)
   File "/var/www/virtualenv/lib/python2.6/site-packages/django/conf/__init__.py", line 89, in __init__
     raise ImportError("Could not import settings '%s' (Is it on sys.path?): %s" % (self.SETTINGS_MODULE, e))
 ImportError: Could not import settings 'domain.settings' (Is it on sys.path?): No module named python.config

你可以看到,settings.py文件在尝试加载时打印了“prior to import”,但在导入“my.python.config.ConfigParser”时失败了。不过,它似乎把它识别成了python.config?

有没有什么线索?

我今天都快抓狂了。不过在Eclipse环境中和直接运行'django-admin.py runserver 80'时,一切都能正常工作,前提是我设置了python路径和Django环境变量。我也确认了python路径在sys.path中。

我已经没有主意了,所以任何帮助都非常感谢!

2 个回答

0

你在/var/www/site的所有子目录及其子目录里都有__init__.py文件吗?

当你访问my.python.config时,__init__.py文件需要在我的目录、python目录和config目录里面。

关于权限的问题,wsgi会以apache用户的身份运行(就是你在wsgi.conf里指定的用户)。要注意这一点。

1

在settings.py文件的开头添加以下内容:

import my
print my.__file__

确认打印出来的路径是你期待的那个'my'包的路径。

换句话说,可能会因为在不同的位置存在多个'my'包,而导致系统选错了包,这通常是因为sys.path的顺序不对。

另外,确保你去看看:

http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

这篇文章讨论了sys.path的顺序问题。

撰写回答