【问题标题】:Issue with imports when using WSGI in EC2 Instance to Host Flask App在 EC2 实例中使用 WSGI 来托管 Flask 应用程序时出现导入问题
【发布时间】:2017-07-13 07:22:25
【问题描述】:

我正在尝试使用 mod_wsgi 从 EC2 实例上运行一个非常简单的 Flask 应用程序。我的 apache 错误日志一直显示

"ImportError: No module named pandas, referer: http://xxxxx"

尽管我已经安装了 pandas。作为参考,pip freeze 产生了我

click==6.7
Flask==0.12
itsdangerous==0.24
Jinja2==2.9.5
MarkupSafe==0.23
numpy==1.12.0
pandas==0.19.2
python-dateutil==2.6.0
pytz==2016.10
scikit-learn==0.18.1
scipy==0.18.1
six==1.10.0
sklearn==0.0
virtualenv==15.1.0
Werkzeug==0.11.15

以前,我尝试使用 virtualenv(我的 venv 的 pip freeze 与我上面提出的非常相似),然后修改 .wsgi 文件以使用带有代码的 virtualenv:

activate_this = '/home/ubuntu/sklearn-env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

通过 virtualenv 执行此操作为我提供了一个烧瓶应用程序,当我发出一个简单的 GET 请求时超时,并且在 apache 错误日志中没有任何用处,并且使用我的本地 pip 为我的所有 Python 模块提供了 ImportErrors,尽管事实上我我能够毫无问题地打开一个 Python2.7 实例并导入熊猫、烧瓶等(Python 2.7.12 供参考)。我完全被难住了,有什么建议吗?

编辑:所以我实际上解决了本地 pip 的问题,就导入错误而言,但现在,我的本地 pip 和使用我的 virtualenv 只会给我一个烧瓶应用程序,如果我导入除了烧瓶之外的任何东西,它就会永远挂起.如果我将这段代码复制到

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
  return 'Hello from Flask!'

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

它工作得很好。我实际上可以添加 import pandas,现在我的应用程序只是无限期地旋转。来自 apache 错误日志的唯一内容是

[2017 年 2 月 23 日星期四 01:02:52.010864] [wsgi:warn] [pid 11686:tid 140507506435968] mod_wsgi:为 Python/2.7.11 编译。 [2017 年 2 月 23 日星期四 01:02:52.010902] [wsgi:warn] [pid 11686:tid 140507506435968] mod_wsgi:使用 Python/2.7.12 的运行时。 [Thu Feb 23 01:02:52.011483 2017] [mpm_event:notice] [pid 11686:tid 140507506435968] AH00489: Apache/2.4.18 (Ubuntu) mod_wsgi/4.3.0 Python/2.7.12 已配置——恢复正常操作 [Thu Feb 23 01:02:52.011498 2017] [core:notice] [pid 11686:tid 140507506435968] AH00094:命令行:'/usr/sbin/apache2'

我的印象是,实际上并没有破坏任何东西。

我的 .conf 文件只是在修改默认文件。

<VirtualHost *:80>
        #ServerName www.example.com

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html

        WSGIDaemonProcess classification-poc threads=5
        WSGIScriptAlias / /var/www/html/classification-poc/server.wsgi

        <Directory classification-poc>
    WSGIProcessGroup classification-poc
    WSGIApplicationGroup %{GLOBAL}
   Order deny,allow
    Allow from all
        </Directory>

        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined


        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

我的 server.wsgi 文件只是

import sys
sys.path.insert(0, '/var/www/html/classification-poc')
from testserver import app as application

当我不使用 virtualenv 时。当我尝试使用 virtualenv 时,我只是添加了

activate_this = '/home/ubuntu/sklearn-env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

到文件的顶部。

【问题讨论】:

  • 显示处理wsgi配置的代码
  • 添加到我的最新编辑中
  • 你发现问题了吗?这里也有同样的问题!

标签: apache python-2.7 amazon-ec2 flask mod-wsgi


【解决方案1】:

经过漫长而痛苦的练习,我终于能够让我的应用运行起来 .问题出在将应用程序导入 .wsgi 文件时构建的 pandas 0.19.2

解决它 从全局级别删除您的导入并在函数级别插入它们

import pandas as pd
....
@app.route('/getFunction', methods=["GET"])
def sample_get_function():
    movieData=pd.read_csv('someData.csv')

....
@app.route('/getFunction', methods=["GET"])
def sample_get_function():
    import pandas as pd
    movieData=pd.read_csv('someData.csv')

这不是一个很好的解决方案,但它正在工作

【讨论】:

    【解决方案2】:

    你必须设置:

    WSGIApplicationGroup %{GLOBAL}
    

    在 mod_wsgi 配置中使用numpy 和相关包时。如果不这样做,它可能会挂起,因为 numpy 尚未以可以在 Python 子解释器中工作的方式实现。

    见:

    【讨论】:

    • 如果您的意思是这样的话,我已经在可用站点的 .conf 文件中找到了它。如果有帮助,我会在我的问题中添加更多信息。
    • 在正确的上下文中获取它很重要。使用modwsgi.readthedocs.io/en/develop/user-guides/…的测试程序进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多