2015-01-03 39 views
1

我想知道如何使用virtualenv在uWSGI中运行Flask Web应用程序。我有一个uWSGI的全局安装,Flask在我的项目的虚拟环境目录中安装了pip。为什么uWSGI无法找到Flask的functools模块?

在皇帝模式启动uwsgi当我收到以下错误:

Traceback (most recent call last): 
    File "/var/www/myapp/MyModule/__init__.py", line 1, in <module> 
    from flask import Flask 
    File "/var/www/myapp/environment/lib/python2.7/site-packages/flask/__init__.py", line 17, in <module> 
    from werkzeug.exceptions import abort 
    File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/__init__.py", line 20, in <module> 
    from werkzeug._compat import iteritems 
    File "/var/www/myapp/environment/lib/python2.7/site-packages/werkzeug/_compat.py", line 3, in <module> 
    import functools 
ImportError: No module named functools 

emperor.ini文件看起来像这样:

[uwsgi] 
daemonize = /var/log/uwsgi/emperor.log 
touch-logreopen = /etc/uwsgi/logrotate.trigger 
emperor = /etc/uwsgi/apps-enabled 
pidfile = /var/run/uwsgi/emperor.pid 
die-on-term = true 

的/ etc/uwsgi/apps-available/myapp.ini文件看起来像这样:

[uwsgi] 
socket = 127.0.0.1:9000 
wsgi-file = /var/www/myapp/MyModule/__init__.py 
virtualenv = /var/www/myapp/environment/ 
pythonpath = /var/www/myapp/environment/lib/python2.7/site-packages 
pythonpath = /var/www/myapp/MyModule/ 
callable = app 
no-site = True 
processes = 4 
threads = 2 
logto = /var/log/uwsgi/myapp.log 

该文件被链接到/etc/uwsgi/apps-enabled/myapp.ini

为了完整起见,我使用systemd管理在Debian 7.7的服务,我的启动文件看起来是这样的:

[Unit] 
Description=uWSGI Emperor 
After=syslog.target 

[Service] 
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/apps-enabled --uid www-data --gid www-data 
Restart=always 
KillSignal=SIGQUIT 
Type=notify 
StandardError=syslog 
NotifyAccess=all 

[Install]t 
WantedBy=multi-user.target 

我曾尝试:

  • 在皇帝模式下运行得到了同样的错误,如皇帝模式下运行
  • 使用瓶的嵌入式服务器,这实际上工作得很好
  • 在虚拟环境中,它产生的错误,它无法加载不同模块
  • 重建VM的python 2.7和python 3.2之间切换,重新安装Debian的,其次详细的nginx + uwsgi +烧瓶导向
  • 运行不使用的烧瓶中,一个基本的hello world一个应用程序,它在不改变uwsgi或nginx的配置
  • 更改MYAPP.INI使用,并且也省略no-site工作得很好;省略它会导致有关无法加载一个模块命名的网站
  • 使用MYAPP.INI模块声明,像这样的错误:模块= MyModule的:应用程序,同样的问题
  • 改变了应用程序的目录结构,最初使用WSGI的.py外面模块目录(/var/www/myapp/wsgi.py)
  • 在网上淘的答案超过7小时了

我该如何解决这个问题呢?

编辑1

我还在就这个问题和我已经删除了no-site选项,但一直没能得到它超越运行。我最初认为它可能是一个权限问题,从不同的用户创建virtualenv,但在运行chown后,它仍然显示错误ImportError:没有名为站点的模块。

我也尝试创建一个简单的hello world烧瓶应用程序,并把我的你好。py文件在virtualenv目录中,因为我在论坛上看到了这个建议,但没有任何帮助。我设置了no-site = True,我仍然看到ImportError:没有名为flask的模块。不过,通过激活virtualenv并使用内置的Web服务器运行python hello.py,应用程序仍能正常运行。

+0

除非你知道你在做什么,否则绝对不要使用no-site。检查uWSGI使用的python版本(它是在初始日志中打印的),它必须与virtualenv相同。如果它们不同,你将得到站点模块错误(这是混合环境时的标准python行为) – roberto

+0

@roberto我激活virtualenv和“linux2上的Python 2.7.3 [GCC 4.7.2]”。我关闭了virtualenv,它和时间戳完全一样。但是,我确实注意到uWSGI说了一些喜欢混合解释模式的东西。系统安装了几个不同版本的Python,但在virtualenv中运行的版本是系统的默认版本。我还用'-p/usr/bin/python2'创建了virtualenv,它链接到python2.7。我原本以为是这样,这将是一个简单的解决方案。我只使用无站点,因为它至少得到了Flask的代码库。 –

+0

激活/关闭venv是无用的(它只在当前会话中设置环境变量)。 uWSGI照顾它。请检查uWSGI使用的python版本,它必须与您的virtualenv相同。 – roberto

回答

0

我将系统重新映像到Arch Linux以尽可能多地删除变量,从源代码下载并构建uWSGI,开始安装特定的Python版本,并且实现了Python 3.2不受Flask支持。当我将它安装在Debian上时,它使用Python 3.2安装,Arch的软件包安装了3.4.2。由于Flask支持3.4.x,所以问题解决了。

至于Python 2.7不工作,我不知道。

相关问题