为什么 uWSGI 无法定位 Flask 的 functools 模块?
Why is uWSGI incapable of locating the functools module for Flask?
我想知道如何使用 virtualenv 在 uWSGI 中运行 Flask web 应用程序。我有一个全局安装的 uWSGI,Flask 在我的项目的虚拟环境目录中安装了 pip。
在皇帝模式下启动 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
我尝试过的:
- 不在皇帝模式下运行得到与在皇帝模式下运行相同的错误
- 使用 Flask 的嵌入式服务器,实际运行良好
- 在虚拟环境中 python 2.7 和 python 3.2 之间切换,产生无法加载 不同 模块的错误
- 重建虚拟机,重新安装 Debian,遵循详细的 nginx + uwsgi + flask 指南
- 运行一个不使用 Flask 的应用程序,一个基本的 hello world,它在不更改 uwsgi 或 nginx 配置的情况下运行良好
- 将 myapp.ini 更改为使用并省略
no-site
;省略它会导致无法加载名为 site 的模块的错误
- 像这样使用 myapp.ini 模块声明:module = MyModule:app,同样的问题
- 更改应用程序目录结构,最初使用模块目录之外的 wsgi.py (/var/www/myapp/wsgi.py)
- 现在在网上搜索了 7 个多小时的答案
我该如何解决这个问题?
编辑 1
我仍在努力解决这个问题,我已经删除了 no-site
选项,但无法让它运行超过该选项。我最初认为这可能是从不同用户创建 virtualenv 的权限问题,但在运行 chown 后它仍然显示错误 ImportError: No module named site.
我还尝试创建一个简单的 hello world Flask 应用程序并将我的 hello.py 文件放在 virtualenv 目录中,因为我在论坛上看到了这个建议,但它没有帮不上忙我设置了 no-site = True
,但我仍然看到 ImportError: No module named flask。不过,通过激活 virtualenv 并使用内置 Web 服务器运行 python hello.py
,应用程序仍然可以正常运行。
我将系统重新映像到 Arch Linux 以删除尽可能多的变量,从源代码下载并构建 uWSGI,开始安装特定的 Python 版本并实现 Python Flask 不支持 3.2。当我在 Debian 上安装它时,它安装了 Python 3.2,而 Arch 的软件包有 3.4.2。由于3.4.x是Flask支持的,所以问题解决了
至于 Python 2.7 不工作,我不知道。
我想知道如何使用 virtualenv 在 uWSGI 中运行 Flask web 应用程序。我有一个全局安装的 uWSGI,Flask 在我的项目的虚拟环境目录中安装了 pip。
在皇帝模式下启动 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
我尝试过的:
- 不在皇帝模式下运行得到与在皇帝模式下运行相同的错误
- 使用 Flask 的嵌入式服务器,实际运行良好
- 在虚拟环境中 python 2.7 和 python 3.2 之间切换,产生无法加载 不同 模块的错误
- 重建虚拟机,重新安装 Debian,遵循详细的 nginx + uwsgi + flask 指南
- 运行一个不使用 Flask 的应用程序,一个基本的 hello world,它在不更改 uwsgi 或 nginx 配置的情况下运行良好
- 将 myapp.ini 更改为使用并省略
no-site
;省略它会导致无法加载名为 site 的模块的错误
- 像这样使用 myapp.ini 模块声明:module = MyModule:app,同样的问题
- 更改应用程序目录结构,最初使用模块目录之外的 wsgi.py (/var/www/myapp/wsgi.py)
- 现在在网上搜索了 7 个多小时的答案
我该如何解决这个问题?
编辑 1
我仍在努力解决这个问题,我已经删除了 no-site
选项,但无法让它运行超过该选项。我最初认为这可能是从不同用户创建 virtualenv 的权限问题,但在运行 chown 后它仍然显示错误 ImportError: No module named site.
我还尝试创建一个简单的 hello world Flask 应用程序并将我的 hello.py 文件放在 virtualenv 目录中,因为我在论坛上看到了这个建议,但它没有帮不上忙我设置了 no-site = True
,但我仍然看到 ImportError: No module named flask。不过,通过激活 virtualenv 并使用内置 Web 服务器运行 python hello.py
,应用程序仍然可以正常运行。
我将系统重新映像到 Arch Linux 以删除尽可能多的变量,从源代码下载并构建 uWSGI,开始安装特定的 Python 版本并实现 Python Flask 不支持 3.2。当我在 Debian 上安装它时,它安装了 Python 3.2,而 Arch 的软件包有 3.4.2。由于3.4.x是Flask支持的,所以问题解决了
至于 Python 2.7 不工作,我不知道。