<p>当uwsgi尝试读取wsgi.py文件时,通常会出现以下错误<code>ImportError: No module named django.core.wsgi</code>:</p>
<pre><code>from django.core.wsgi import get_wsgi_application
</code></pre>
<p>它找不到这些模块,因为没有安装Django,或者如果安装了Django,它就不在PYTHONPATH中。</p>
<p>如果您的项目位于virtualenv中,而Django仅安装在此virtualenv中,则Django模块的路径不在<a href="https://docs.python.org/2/using/cmdline.html#envvar-PYTHONPATH">PYTHONPATH</a>中,因此Python找不到它。</p>
<p>如果您感兴趣,可以将以下代码插入<code>wsgi.py</code>文件,并查看PYTHONPATH:</p>
<pre><code>import os
print '===== sys.path / PYTHONPATH ====='
for k in sorted(os.environ.keys()):
v = os.environ[k]
print ('%-30s %s' % (k,v[:70]))
</code></pre>
<p>如果运行安装在virtualenv中的本地版本的uwsgi,则路径设置将正确,但如果运行全局版本的uwsgi,则通常不会正确设置PYTHONPATH。</p>
<p>你可以告诉uWSGI到virtualenv的路径,它会找出正确的PYTHONPATH。只需使用<code>--virtualenv</code>命令行参数,例如:</p>
<pre><code>uwsgi --http :8001 --module wsgi --virtualenv /home/jdoe/myvirtualenv
</code></pre>
<p>(以下参数的作用与--virtualenv完全相同:--venv,--home,-H)</p>
<h2>令人惊讶的是,设置$VIRTUAL_ENV对PYTHONPATH没有影响</h2>
<p>奇怪的是,如果不使用--virtualenv参数,环境变量<code>$VIRTUAL_ENV</code>将被正确设置。通过插入wsgi.py进行测试:</p>
<pre><code>print os.environ['VIRTUAL_ENV']
</code></pre>
<p>这将打印:</p>
<pre><code>/home/jdoe/myvirtualenv
</code></pre>
<p>但是PYTHONPATH的<em>设置不正确,并且不包含来自virtualenv的任何内容。</p>
<p>我无法解释这是为什么。</p>