Flask 看不到 pip 安装的模块
Flask can't see modules installed by pip
我在 Python 2.7.12/Apache 2.4/Ubuntu 16.04.1 LTS 上安装了 Flask。我一直在使用 these two tutorials to get set up. I'm not running venv
or any other virtual environment (unlike this post)。 运行 一个简单的 Flask 应用程序运行良好(la "hello world")。我在同一目录 (/var/www/html) 中有一个 flaskapp.wsgi 和一个 flaskapp.py。
flaskapp.wsgi
import sys
sys.path.insert(0, "/var/www/html/flaskapp")
from flaskapp import app as application
flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def main():
return "hello world"
if __name__ == '__main__':
app.run()
但是当我尝试导入 Flask 基本模块集之外的模块时,例如。 httplib2
(我通过 pip
安装),我收到 500 HTTP 错误。简单地将 import httplib2
添加到 flaskapp.py 会引发此错误。
查看 Apache 错误日志,我看到以下内容:
[wsgi:error] mod_wsgi (pid=22739): Target WSGI script '/var/www/html/flaskapp/flaskapp.wsgi' cannot be loaded as Python module.
[wsgi:error] mod_wsgi (pid=22739): Exception occurred processing WSGI script '/var/www/html/flaskapp/flaskapp.wsgi'.
[wsgi:error] Traceback (most recent call last):
[wsgi:error] File "/var/www/html/flaskapp/flaskapp.wsgi", line 7, in <module>
[wsgi:error] from flaskapp import app as application
[wsgi:error] File "/var/www/html/flaskapp/flaskapp.py", line 7, in <module>
[wsgi:error] import httplib2
[wsgi:error] ImportError: No module named httplib2
当我 运行 python
(不使用 Flask)时,我可以毫无困难地导入 httplib2
。因此,出于某种原因,我的 Flask 应用程序似乎无法访问 pip 的导入。
以下是我到目前为止所做的故障排除:
我使用 __file__
:
检查了 httplib2
住在哪里
>>> import httplib2
>>> httplib2.__file__
'/home/andrew/.local/lib/python2.7/site-packages/httplib2/__init__.pyc'
然后我在 Flask 应用程序中检查了 sys.path
和 pip.get_installed_distributions()
:
flaskapp.py(修订)
from flask import Flask, jsonify
import pip, sys
modules = ""
for i in pip.get_installed_distributions():
modules = modules + " " + str(i)
app = Flask(__name__)
@app.route('/')
def main():
return jsonify({ "modules":modules, "sys.path":sys.path })
if __name__ == '__main__':
app.run()
输出:
{
"available_modules": " Flask 0.12 Jinja2 2.9.5 itsdangerous 0.24 Werkzeug 0.11.15 MarkupSafe 0.23 click 6.7",
"sys.path": [
"/usr/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl",
"/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl",
"/usr/share/python-wheels/wheel-0.29.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl",
"/usr/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl",
"/usr/share/python-wheels/distlib-0.2.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/pyparsing-2.0.3-py2.py3-none-any.whl",
"/usr/share/python-wheels/packaging-16.6-py2.py3-none-any.whl",
"/usr/share/python-wheels/html5lib-0.999-py2.py3-none-any.whl",
"/usr/share/python-wheels/CacheControl-0.11.5-py2.py3-none-any.whl",
"/usr/share/python-wheels/six-1.10.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/chardet-2.3.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/progress-1.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/setuptools-20.7.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/pip-8.1.1-py2.py3-none-any.whl",
"/var/www/html/flaskapp",
"/usr/lib/python2.7",
"/usr/lib/python2.7/plat-x86_64-linux-gnu",
"/usr/lib/python2.7/lib-tk",
"/usr/lib/python2.7/lib-old",
"/usr/lib/python2.7/lib-dynload",
"/usr/local/lib/python2.7/dist-packages",
"/usr/lib/python2.7/dist-packages"
]
}
所以它可以看到httplib2
所在的路径,以及flask
所在的路径,但是可用的模块只有Flask模块。
我不确定这是否是我的 Apache 配置的问题 - 我已经查阅了一些操作指南和文档,这是我一直在使用的设置:
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp
WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/flaskapp>
WSGIProcessGroup flaskapp
WSGIApplicationGroup %{GLOBAL}
Require all granted
WSGIScriptReloading On
</Directory>
</VirtualHost>
我浏览了许多 SO 帖子,但大多数人似乎都担心 app
对 WSGI 不可见。 看起来很接近,但还没有解决我的问题。如果有任何建议,我将不胜感激!
注意:我对 Python 很满意,对 Flask 比较熟悉,但对 Apache 和 WSGI 还是个新手。关于后两个主题(如果适用)的详细 [=81=] 答案确实有帮助。
您应该在 Apache 配置中将 ~/.local/
添加到 python-path。
WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp:/home/andrew/.local
您还应该尝试使用虚拟环境,并在 WSGIDaemonProcess 上设置 python-home 作为环境根。
来源:http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
编辑
您也可以使用 sudo
安装 httplib2
,就像安装 flask
软件包一样(如 one of your links 所示)
我在 Python 2.7.12/Apache 2.4/Ubuntu 16.04.1 LTS 上安装了 Flask。我一直在使用 these two tutorials to get set up. I'm not running venv
or any other virtual environment (unlike this post)。 运行 一个简单的 Flask 应用程序运行良好(la "hello world")。我在同一目录 (/var/www/html) 中有一个 flaskapp.wsgi 和一个 flaskapp.py。
flaskapp.wsgi
import sys
sys.path.insert(0, "/var/www/html/flaskapp")
from flaskapp import app as application
flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def main():
return "hello world"
if __name__ == '__main__':
app.run()
但是当我尝试导入 Flask 基本模块集之外的模块时,例如。 httplib2
(我通过 pip
安装),我收到 500 HTTP 错误。简单地将 import httplib2
添加到 flaskapp.py 会引发此错误。
查看 Apache 错误日志,我看到以下内容:
[wsgi:error] mod_wsgi (pid=22739): Target WSGI script '/var/www/html/flaskapp/flaskapp.wsgi' cannot be loaded as Python module.
[wsgi:error] mod_wsgi (pid=22739): Exception occurred processing WSGI script '/var/www/html/flaskapp/flaskapp.wsgi'.
[wsgi:error] Traceback (most recent call last):
[wsgi:error] File "/var/www/html/flaskapp/flaskapp.wsgi", line 7, in <module>
[wsgi:error] from flaskapp import app as application
[wsgi:error] File "/var/www/html/flaskapp/flaskapp.py", line 7, in <module>
[wsgi:error] import httplib2
[wsgi:error] ImportError: No module named httplib2
当我 运行 python
(不使用 Flask)时,我可以毫无困难地导入 httplib2
。因此,出于某种原因,我的 Flask 应用程序似乎无法访问 pip 的导入。
以下是我到目前为止所做的故障排除:
我使用 __file__
:
httplib2
住在哪里
>>> import httplib2
>>> httplib2.__file__
'/home/andrew/.local/lib/python2.7/site-packages/httplib2/__init__.pyc'
然后我在 Flask 应用程序中检查了 sys.path
和 pip.get_installed_distributions()
:
flaskapp.py(修订)
from flask import Flask, jsonify
import pip, sys
modules = ""
for i in pip.get_installed_distributions():
modules = modules + " " + str(i)
app = Flask(__name__)
@app.route('/')
def main():
return jsonify({ "modules":modules, "sys.path":sys.path })
if __name__ == '__main__':
app.run()
输出:
{
"available_modules": " Flask 0.12 Jinja2 2.9.5 itsdangerous 0.24 Werkzeug 0.11.15 MarkupSafe 0.23 click 6.7",
"sys.path": [
"/usr/share/python-wheels/lockfile-0.12.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/pkg_resources-0.0.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/retrying-1.3.3-py2.py3-none-any.whl",
"/usr/share/python-wheels/requests-2.9.1-py2.py3-none-any.whl",
"/usr/share/python-wheels/wheel-0.29.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/urllib3-1.13.1-py2.py3-none-any.whl",
"/usr/share/python-wheels/ipaddress-0.0.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/colorama-0.3.7-py2.py3-none-any.whl",
"/usr/share/python-wheels/distlib-0.2.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/pyparsing-2.0.3-py2.py3-none-any.whl",
"/usr/share/python-wheels/packaging-16.6-py2.py3-none-any.whl",
"/usr/share/python-wheels/html5lib-0.999-py2.py3-none-any.whl",
"/usr/share/python-wheels/CacheControl-0.11.5-py2.py3-none-any.whl",
"/usr/share/python-wheels/six-1.10.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/chardet-2.3.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/progress-1.2-py2.py3-none-any.whl",
"/usr/share/python-wheels/setuptools-20.7.0-py2.py3-none-any.whl",
"/usr/share/python-wheels/pip-8.1.1-py2.py3-none-any.whl",
"/var/www/html/flaskapp",
"/usr/lib/python2.7",
"/usr/lib/python2.7/plat-x86_64-linux-gnu",
"/usr/lib/python2.7/lib-tk",
"/usr/lib/python2.7/lib-old",
"/usr/lib/python2.7/lib-dynload",
"/usr/local/lib/python2.7/dist-packages",
"/usr/lib/python2.7/dist-packages"
]
}
所以它可以看到httplib2
所在的路径,以及flask
所在的路径,但是可用的模块只有Flask模块。
我不确定这是否是我的 Apache 配置的问题 - 我已经查阅了一些操作指南和文档,这是我一直在使用的设置:
/etc/apache2/sites-enabled/000-default.conf
<VirtualHost *:80>
WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp
WSGIScriptAlias / /var/www/html/flaskapp/flaskapp.wsgi
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/flaskapp>
WSGIProcessGroup flaskapp
WSGIApplicationGroup %{GLOBAL}
Require all granted
WSGIScriptReloading On
</Directory>
</VirtualHost>
我浏览了许多 SO 帖子,但大多数人似乎都担心 app
对 WSGI 不可见。
注意:我对 Python 很满意,对 Flask 比较熟悉,但对 Apache 和 WSGI 还是个新手。关于后两个主题(如果适用)的详细 [=81=] 答案确实有帮助。
您应该在 Apache 配置中将 ~/.local/
添加到 python-path。
WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp:/home/andrew/.local
您还应该尝试使用虚拟环境,并在 WSGIDaemonProcess 上设置 python-home 作为环境根。
来源:http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html
编辑
您也可以使用 sudo
安装 httplib2
,就像安装 flask
软件包一样(如 one of your links 所示)