(SO上的其他帖子类似,但没有一个具有uwsgi + Flask + virtualenv的特定组合)(This one is closest)
我通过apt-get安装了uwsgi。我也试过pip install wsgi。两人都给了我同样的问题。
测试命令:
sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H myvirtualenv
结果:
Python version: 2.7.4 (default, Apr 19, 2013, 18:35:44) [GCC 4.7.3]
Set PythonHome to myvirtualenv
ImportError: No module named site
我可以在虚拟环境中运行我的应用程序。
答案 0 :(得分:23)
虚拟环境的路径错误。这是这个错误的原因。
我正在使用virtualenvwrapper,我的虚拟环境设置为〜/ .virtualenvs。所以在我的情况下,uwsgi调用看起来像
sudo uwsgi -s /tmp/uwsgi.sock -w myapp:app -H ~/.virtualenvs/myapp
希望这有助于下次有人来寻找这个。
感谢Cody在评论中指出它。
答案 1 :(得分:21)
首先查看@JRajan的答案。
如果您确定只想压制错误而不是解决潜在问题,则应将--no-site
添加到您的命令或{ {1}}到你的uwsgi.ini文件。
答案 2 :(得分:13)
在我的情况下,问题是uWSGI试图使用的python版本。
我的项目是用python 3.4编写的,但是我没有在uWSGI配置中指定它。所以uWSGI试图使用python 2并尝试从virtualenv中的文件夹lib / python2.7导入模块。
所以我收到了名为site'错误,因为所有模块,包括站点模块,里面的lib / python3.4,不是lib / python2.7。
要解决这个问题,我必须做两件事:
为uWSGI安装python3插件,使用:
apt-get install uwsgi-plugin-python3
在.ini配置文件中使用它,其中:
plugins = python34
希望这可以帮助将来遇到同样问题的人。
根据要求,这里是我的.ini文件:
[uwsgi]
base = /your/app/path
pythonpath = %(base)
module = your_module_name
callable = app #Here you put the name of the variable which holds your app inside your module
home = /your/virtualenv/path
plugins = python34
master = true
processes = 2
uid = www-data
gid = www-data
socket = /path/to/socket
chmod-socket = 660
die-on-term = true
logto = /var/log/uwsgi/%n.log
答案 3 :(得分:8)
之前我遇到过类似的问题。我的问题是我的ubuntu系统上有python2.x和python3.x,我希望我的项目在安装了python3环境的虚拟环境中运行。我是如何解决这个问题的:
apt-get install python3-pip
pip3安装uWSGI
这就是全部。
答案 4 :(得分:4)
如果您的虚拟环境在Python3上运行,那么您必须使用pip3安装uwsgi,而不是pip,否则版本不匹配会导致此导入问题
<ContentControl regions:RegionManager.RegionName="MyRegion"></ContentControl>
答案 5 :(得分:1)
由于几个原因,这可能会导致安全失败。它适用于测试。但是在生产中使用这种精确的解决方案之前需要对安全性进行审查
可能发生此错误的另一个原因是与权限相关。如果using an .ini file as described in the official tutorial for uWSGI for django,您可能已经创建了一个用户和组的ini文件,该文件使得运行该进程的用户无法访问该文件。
检查文件的所有者和权限及其所在的目录路径。使用chown和chmod设置所需的权限。
sudo chown -R www-data:www-data /srv
sudo chmod 0775 -R /srv
在我的情况下,我使用了一个流浪盒进行测试,默认用户是“vagrant”,而nginx正在为用户和组使用www-data。我已将项目中所有文件的所有者设置为www-data用户和组,并将vagrant用户添加到www-data组。
sudo gpasswd -a vagrant www-data
我不确定这是否是一种良好的安全措施,所以当我将它投入生产时,我将使用我的系统管理员。但对于我的测试环境,它可以工作。无论哪种方式,许多这些问题都需要仔细查看权限。
答案 6 :(得分:0)
我遇到了同样的问题,我的问题是运行uwsgi的python版本。 uwsgi在python2上运行但我的virtualenv python路径设置为python3。 这造成了冲突,它无法找到已安装的站点包。
仔细检查运行uwsgi的python版本,使其与virtualenv上设置的版本相同。
答案 7 :(得分:0)
当我的自制软件将我的Python版本更新为Python 3.7并停止工作时,我遇到了这个问题。对我有用的是brew info python
-它会向您显示所有可用的Python版本。比起我使用brew switch python 3.6.5
回滚到Python 3.6.5。
之后,我只需使用以下命令重新安装uWSGI:
pip3 uninstall uwsgi
pip3 install uwsgi
然后解决了。如果不确定所使用的Python版本,brew info python
会显示安装日期。另外,您可以使用pip3 list
检查是否为当前版本安装了uWSGI。
希望这会有所帮助!