Python uwsgi 与 virtualenv --no-site-packages -- 导入 site = AttributeError {'userbase'}
长话短说,我有一个nginx和uwsgi的部署,但在部署脚本中我不能使用
import site
否则会报错
Traceback (most recent call last):
File "/home/PROJECT/virtualenv/PROJECT/deploy/deploy.py", line 1, in <module>
import site
File "/usr/lib/python2.7/site.py", line 562, in <module>
main()
File "/usr/lib/python2.7/site.py", line 544, in main
known_paths = addusersitepackages(known_paths)
File "/usr/lib/python2.7/site.py", line 271, in addusersitepackages
user_site = getusersitepackages()
File "/usr/lib/python2.7/site.py", line 260, in getusersitepackages
USER_SITE = get_path('purelib', '%s_user' % os.name)
File "/usr/lib/python2.7/sysconfig.py", line 426, in get_path
return get_paths(scheme, vars, expand)[name]
File "/usr/lib/python2.7/sysconfig.py", line 417, in get_paths
return _expand_vars(scheme, vars)
File "/usr/lib/python2.7/sysconfig.py", line 177, in _expand_vars
res[key] = os.path.normpath(_subst_vars(value, vars))
File "/usr/lib/python2.7/sysconfig.py", line 159, in _subst_vars
raise AttributeError('{%s}' % var)
AttributeError: {'userbase'}
如果我对所有内容都使用sys.path.append,那是可以的,但这样就不遵循任何的egg路径链接了
参考资料:
nginx配置文件
server {
listen 80;
server_name example.com;
access_log /home/PROJECT/logs/nginx/access.log;
error_log /home/PROJECT/logs/nginx/error.log;
client_max_body_size 10m;
keepalive_timeout 120;
location /static/ {
# root /home/PROJECT/virtualenv/PROJECT/;
alias /home/PROJECT/virtualenv/PROJECT/static/;
autoindex on;
# error_page 404 = "404";
}
location /media/ {
# root /home/PROJECT/virtualenv/PROJECT/;
alias /home/PROJECT/virtualenv/PROJECT/media/;
autoindex on;
error_page 404 = "404";
}
location / {
uwsgi_pass uwsgi_main;
include uwsgi_params;
uwsgi_param UWSGI_PYHOME /home/PROJECT/virtualenv;
uwsgi_param UWSGI_SCRIPT deploy.deploy;
uwsgi_param UWSGI_CHDIR /home/PROJECT/virtualenv/PROJECT;
root /home/PROJECT/virtualenv;
}
}
uwsgi的启动脚本
description "uWSGI starter"
start on (local-filesystems
and runlevel [2345])
stop on runlevel [016]
respawn
exec /usr/local/sbin/uwsgi \
--uid www-data \
--socket 127.0.0.1:5050 \
--master \
--logto /var/log/uwsgi_main.log \
--logdate \
--optimize 2 \
--processes 2 \
--harakiri 120 \
--vhost \
--no-site
部署脚本deploy.py
import sys
import site
import os
envroot = '/home/project/virtualenv'
#envroot = os.path.join(os.path.abspath(__file__), '../..')
prev_sys_path = list(sys.path)
site.addsitedir(os.path.join(envroot, 'lib/python2.7/site-packages'))
sys.path.append(os.path.join(envroot, 'project'))
new_sys_path = [p for p in sys.path if p not in prev_sys_path]
for item in new_sys_path:
sys.path.remove(item)
sys.path[:0] = new_sys_path
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()
有没有什么想法?有没有解决办法?
我的目标是能够使用虚拟环境设置python路径,并且能够遵循.egg和.pth文件中的路径链接
1 个回答
2
我对uwsgi和nginx的配置不是很熟悉。不过我知道,你需要用你虚拟环境提供的Python解释器来运行你的WSGI应用程序,也就是deploy.py
。在你的情况下,就是/home/project/virtualenv/bin/python
。
你可能使用的是uWSGI 0.9.7或更高版本。如果是这样,这里有一个解决方法可以帮助你。这个邮件列表里有信息说这个问题在tip
中已经修复了。这可能意味着在当前稳定的0.9.9版本中,问题已经被解决了。