我正在运行一个托管在共享服务器上的基于Django的网站(即我只有一个有限的帐户,没有管理员权限)。服务器的管理员为Python 2.7安装了Django模块,但现在我想添加一个名为django-bleach的第三方Django库。所以我使用
在本地安装它pip install --user django-bleach
然后,按照in the django-bleach documentation的说明,我添加了' django-bleach'到settings.py
中的INSTALLED_APPS列表。但是,当我触摸wsgi.py
让Apache重新加载我的代码时,我的Apache日志中出现了ImportError。通常这意味着我尝试导入的模块不在PYTHONPATH中,因此我在print sys.path
中添加了wsgi.py
语句。这就是:
[Mon Nov 24 13:44:58 2014] [error] sys.path is: ['/extra/www/html/quotes/quotes_django', '/opt/rh/python27/root/usr/lib64/python2.7/site-packages',
'/usr/lib64/python27.zip', '/usr/lib64/python2.7', '/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', '/usr/lib64/python2.7/lib-old',
'/usr/lib64/python2.7/lib-dynload', '/usr/lib64/python2.7/site-packages', '/usr/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages',
'/users/ejt64/.local/lib/python2.7/site-packages', '/users/ejt64/.local/lib/python2.7/site-packages']
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Target WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py' cannot be loaded as Python module.
[Mon Nov 24 13:44:58 2014] [error] mod_wsgi (pid=29372): Exception occurred processing WSGI script '/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py'.
[Mon Nov 24 13:44:58 2014] [error] Traceback (most recent call last):
[Mon Nov 24 13:44:58 2014] [error] File "/extra/www/html/quotes/quotes_django/quotes_django/wsgi.py", line 17, in <module>
[Mon Nov 24 13:44:58 2014] [error] application = get_wsgi_application()
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/core/wsgi.py", line 14, in get_wsgi_application
[Mon Nov 24 13:44:58 2014] [error] django.setup()
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/__init__.py", line 21, in setup
[Mon Nov 24 13:44:58 2014] [error] apps.populate(settings.INSTALLED_APPS)
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/registry.py", line 85, in populate
[Mon Nov 24 13:44:58 2014] [error] app_config = AppConfig.create(entry)
[Mon Nov 24 13:44:58 2014] [error] File "/opt/rh/python27/root/usr/lib64/python2.7/site-packages/django/apps/config.py", line 87, in create
[Mon Nov 24 13:44:58 2014] [error] module = import_module(entry)
[Mon Nov 24 13:44:58 2014] [error] File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
[Mon Nov 24 13:44:58 2014] [error] __import__(name)
[Mon Nov 24 13:44:58 2014] [error] ImportError: No module named django_bleach
请注意,/users/ejt64/.local/lib/python2.7/site-packages/
目录(在sys.path中出现三次)是我安装了django-bleach的用户本地Python位置。我使这个目录具有全局可读性,以防Apache进程遇到访问我的目录的权限问题。那我怎么能得到一个ImportError?
Python 2.7.5 (default, Dec 3 2013, 08:35:16)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import django_bleach
>>>
但我的Django应用程序无法以某种方式找到django_bleach模块,即使它正在寻找合适的位置。
其他信息:我的wsgi.py
只是django-admin startproject
生成的标准文件,加上打印声明:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "quotes_django.settings")
import sys
print >>sys.stderr, "sys.path is: " + str(sys.path)
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()
答案 0 :(得分:2)
好吧,我终于解决了我的问题。事实证明,尽管/users/ejt64/.local/lib/python2.7/site-packages/
在由WSGI搜索的PYTHONPATH上,但我忘记了沿着该路径生成其中一个目录 - 可执行文件,因此Apache用户无法&#39;访问它。
虽然所有目录和文件都是世界可读,但用户无法读取世界可读文件,除非它对包含它的所有目录都具有执行权限,并且我的主目录(/users/ejt64
)是世界可读的,但不是世界可执行的。一旦我将这个目录设为可执行的,ImportError
就会消失。
如果我能在Apache / WSGI / Python尝试读取PYTHONPATH上的目录但是由于权限无法访问它时,会发现错误消息,这肯定会很好。
答案 1 :(得分:-1)
~/.local/lib/python2.7/site-packages/
相对于运行apache的用户。什么用户正在运行apache?通常,apache作为默认用户'nobody'或'apache'运行。拥有'〜'的相对路径将指向运行apache的用户的主目录。
我建议使用virtualenv或指定本地pip包的绝对路径。进入您的站点包目录并运行pwd
将告诉您绝对路径。如果运行apache的用户无法对它们进行读/写/执行,则可能需要更改pip包和目录的权限。
当您放入Python REPL时,它可以正常运行,因为您正在以用户身份执行所有操作,并且“〜”指向您的主目录。
如果您有权编辑服务器上的apache配置文件,我建议您查看这个Django文档, https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/modwsgi/#using-a-virtualenv 如果您不使用virtualenv事件,则仍需要将此设置相应地设置为本地site-packages目录的绝对路径。
WSGIPythonPath /path/to/mysite.com:/path/to/your/venv/lib/python3.X/site-packages