uWSGI + virtualenv 'No module named site'

杀马特。学长 韩版系。学妹 提交于 2020-08-22 04:21:05

问题


So this seems to be a really common problem with this setup, but I can't find any solutions that work on SO. I've setup a very new Ubuntu 15.04 server, then installed nginx, virtualenv (and -wrapper), and uWSGI (via apt-get, so globally, not inside the virtualenv).

My virtualenv is located at /root/Env/example. Inside of the virtualenv, I installed Django, then at /srv/www/example/app ran Django's startproject command with the project name example, so I have vaguely this structure:

-root
  -Env
    -example
      -bin
      -lib
-srv 
  -www
    -example
      -app
        -example
          manage.py
          -example
            wsgi.py
            ...

My example.ini file for uWSGI looks like this:

[uwsgi]
project = example

plugin = python

chdir = /srv/www/example/app/example
home = /root/Env/example
module = example.wsgi:application

master = true
processes = 5

socket = /run/uwsgi/app/example/example.socket
chmod-socket = 664
uid = www-data
gid = www-data
vacuum = true

But no matter whether I run this via uwsgi --ini /etc/uwsgi/apps-enabled/example.ini or via daemon, I get the exact same error:

Python version: 2.7.9 (default, Apr  2 2015, 15:37:21)  [GCC 4.9.2]
Set PythonHome to /root/Env/example
ImportError: No module named site

I should note that the Django project works via the built-in development server ./manage.py runserver, and that when I remove home = /root/Env/example the thing works (but is obviously using the global Python and Django rather than the virtualenv versions, which means it's useless for a proper virtualenv setup).

Can anyone see some obvious path error that I'm not seeing? As far as I can tell, home is entirely correct based on my directory structure, and everything else in the ini too, so why is it not working with this ImportError?


回答1:


In my case, I was seeing this issue because the django app I was trying to run was written in python 3 whereas uwsgi was configured for python 2. I fixed the problem by:

  1. recompiling uwsgi to support both python 2 and python 3 apps (I followed this guide)
  2. adding this to my mydjangoproject_uwsgi.ini:
plugins         = python35 # or whatever you specified while compiling uwsgi 

For other folks using Django, you should also make sure you are correctly specifying the following:

# Django dir that contains manage.py
chdir           = /var/www/project/myprojectname
# Django wsgi (myprojectname is the name of your top-level project)
module          = myprojectname.wsgi:application
# the virtualenv you are using (full path)
home            = /home/ubuntu/Env/mydjangovenv
plugins         = python35



回答2:


As @Freek said, site refers to a python module.

The error claims that python cannot find that package, which is because you have specified python_home to the wrong location.

I've encountered with the same problem and my uwsgi.ini is like below:

[uwsgi]
# variable
base = /home/xx/
# project settings
chdir = %(base)/
module = botservice.uwsgi:application
home = %(base)/env/bin

For this configuration uwsgi can find python executable in /env/bin but no packages could be found under this folder. So I changed home to

home = %(base)/env/

and it worked for me.

In your case, I suggest digging into home directive and point it to a location which contains both python executable and packages.




回答3:


The site module is in the root of django.

First check is to activate the virtualenv manually (source /root/Env/example/bin/activate, start python and import site). If that fails, pip install django.

Assuming that django is correctly installed in the virtualenv, make sure that uWSGI activates the virtualenv. Relevant uWSGI configuration directives:

plugins = python
virtualenv = /root/Env/example

and in case you have error importing example.wsgi:

pythonpath = /srv/www/example/app/example


来源:https://stackoverflow.com/questions/30447963/uwsgi-virtualenv-no-module-named-site

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!