Python uwsgi w/virtualenv --no-site-packages -- import site = AttributeError {'userbase' }

标签 python nginx virtualenv uwsgi

长话短说,我有一个 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.conf

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 Upstart 脚本

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

部署.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()

有什么想法吗?解决方法??

目标是能够使用 virtualenv 设置 python 路径,并遵循 .egg 和 .pth 文件中的路径链接

最佳答案

我对uwsgi和nginx配置不是很熟悉。但我知道您需要使用 virtualenv 提供的 python 解释器来运行 WSGI 应用程序运行器 deploy.py 。在您的情况下 /home/project/virtualenv/bin/python

您可能拥有 uWSGI 0.9.7 或更高版本。在这种情况下,这里是 workaround对于你的问题。此邮件列表中有信息表明此问题已在 tip 中修复。这可能意味着它已经在当前稳定的 0.9.9 版本中修复。

关于Python uwsgi w/virtualenv --no-site-packages -- import site = AttributeError {'userbase' },我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528779/

相关文章:

python - 在虚拟环境中使用 Apt-Get Python 包

python - mkvirtualenv : command not found

python - 从 Python virtualenv 运行 OpenCV

python - 如何使用带有分数的 numpy 数组?

mysql - Docker Passenger Dashboard 显示 MySQL 无法连接到套接字

php - CSV 上传适用于本地 WAMP,但不适用于使用 LOAD DATA 的远程 LAMP

ruby-on-rails - Phusion Passenger 似乎没有在运行(但我看到它在运行)

python - 动态规划,带约束的最大子数组

python - 添加批量归一化后训练预训练模型 keras_vggface 会产生非常高的损失

javascript - 将 scrapy 与 javascript __doPostBack 方法结合使用时出现问题