简体   繁体   English

Flask看不到pip安装的模块

[英]Flask can't see modules installed by pip

I installed Flask on Python 2.7.12/Apache 2.4/Ubuntu 16.04.1 LTS. 我在Python 2.7.12 / Apache 2.4 / Ubuntu 16.04.1 LTS上安装了Flask。 I've been using these two tutorials to get set up. 我一直在使用 两个教程来设置。 I'm not running venv or any other virtual environment (unlike this post ). 我没有运行venv或任何其他虚拟环境(不像这篇文章 )。 Running a simple Flask app works fine (a la "hello world"). 运行一个简单的Flask应用程序工作正常(一个“hello world”)。 I have a flaskapp.wsgi and a flaskapp.py in the same directory (/var/www/html). 我在同一目录(/ var / www / html)中有一个flaskapp.wsgi和一个flaskapp.py

flaskapp.wsgi flaskapp.wsgi

import sys
sys.path.insert(0, "/var/www/html/flaskapp")
from flaskapp import app as application

flaskapp.py flaskapp.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def main():
    return "hello world"

if __name__ == '__main__':
    app.run()

But when I try to import a module outside of the basic set of Flask modules, eg. 但是当我尝试在基本的Flask模块集之外导入模块时,例如。 httplib2 (which I installed via pip ), I get a 500 HTTP error. httplib2 (我通过pip安装),我收到500 HTTP错误。 Simply adding import httplib2 to flaskapp.py throws this error. 只需将import httplib2添加到flaskapp.py就会抛出此错误。

Looking at the Apache error logs I see the following: 查看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

When I run python (not using Flask), I can import httplib2 without trouble. 当我运行python (不使用Flask)时,我可以毫无困难地导入httplib2 So it seems for some reason my Flask app can't access pip's imports. 所以似乎由于某种原因我的Flask应用程序无法访问pip的导入。

Here's what I've done to troubleshoot so far: 以下是我到目前为止排除故障的方法:

I checked to see where httplib2 lives, using __file__ : 我使用__file__检查了httplib2所在的位置:

>>> import httplib2
>>> httplib2.__file__
'/home/andrew/.local/lib/python2.7/site-packages/httplib2/__init__.pyc'

Then I checked both sys.path and pip.get_installed_distributions() from within the Flask app: 然后我在Flask应用程序中检查了sys.pathpip.get_installed_distributions()

flaskapp.py (revised) 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()

output: 输出:

{
  "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"
  ]
}

So it can see the path where httplib2 lives, as well as the path to flask , but the available modules are only the Flask modules. 因此,它可以看到httplib2所在的路径,以及flask的路径,但可用的模块只是Flask模块。

I'm not sure if this is a problem with my Apache configuration - I've consulted a number of how-tos and documentation, and this is the setup I've been using: 我不确定这是否是我的Apache配置的问题 - 我已经咨询了许多方法和文档,这是我一直在使用的设置:

/etc/apache2/sites-enabled/000-default.conf /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>  

I've looked through a number of SO posts, but most seem concerned with app not being visible to WSGI. 我查看了很多SO帖子,但大多数人似乎都担心WSGI无法看到app Some posts seem close, but haven't solved my problem. 有些 帖子看起来很接近,但还没有解决我的问题。 I'd really appreciate any advice! 我真的很感激任何建议!

Note: I'm pretty comfortable with Python, familiar-ish with Flask, but pretty novice with Apache and WSGI. 注意:我对Python非常熟悉,熟悉Flask,但对Apache和WSGI来说相当新手。 Detailed explanations/links for answers concerning the latter two topics (if appropriate) would really help. 关于后两个主题(如果适用)的答案的详细解释/链接确实会有所帮助。

You should add ~/.local/ to python-path on your Apache configuration. 您应该在Apache配置上添加~/.local/到python-path。

WSGIDaemonProcess flaskapp threads=5 python-path=/var/www/html/flaskapp/flaskapp:/home/andrew/.local

You should also try to use virtual environments, and set python-home on WSGIDaemonProcess as the environment root. 您还应该尝试使用虚拟环境,并将WSGIDaemonProcess上的python-home设置为环境根。

Source: http://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html 资料来源: http//modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html

EDIT 编辑

You can also install httplib2 with sudo just like you installed the flask packages (as seen in one of your links ) 您也可以像安装flask包一样安装带有sudo httplib2 (如您的某个链接所示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM