【问题标题】:How to test Heroku python app locally? ImportError: No module named wsgi如何在本地测试 Heroku python 应用程序? ImportError:没有名为 wsgi 的模块
【发布时间】:2016-12-01 14:15:05
【问题描述】:

第一次在这里使用 Heroku。我想托管一个 python Flask 应用程序。有点开始了解事情是如何运作的。 我想使用heroku local 命令在本地测试我的应用程序,但我收到此错误:

ImportError: 没有名为 wsgi 的模块

这是我的文件:

过程文件:

web: gunicorn choposcope.wsgi --log-file -

myapp.wsgi:

from choposcope import app as application

错误堆栈跟踪:

[2016-12-01 18:36:21 +0100] [9916] [INFO] Starting gunicorn 19.6.0
6:36:21 PM web.1 |  [2016-12-01 18:36:21 +0100] [9916] [INFO] Listening at: http://0.0.0.0:5000 (9916)
6:36:21 PM web.1 |  [2016-12-01 18:36:21 +0100] [9916] [INFO] Using worker: sync
6:36:21 PM web.1 |  [2016-12-01 18:36:21 +0100] [9919] [INFO] Booting worker with pid: 9919
6:36:34 PM web.1 |  [2016-12-01 18:36:34 +0100] [9919] [ERROR] Exception in worker process
6:36:34 PM web.1 |  Traceback (most recent call last):
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
6:36:34 PM web.1 |      worker.init_process()
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/workers/base.py", line 126, in init_process
6:36:34 PM web.1 |      self.load_wsgi()
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
6:36:34 PM web.1 |      self.wsgi = self.app.wsgi()
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/app/base.py", line 67, in wsgi
6:36:34 PM web.1 |      self.callable = self.load()
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
6:36:34 PM web.1 |      return self.load_wsgiapp()
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
6:36:34 PM web.1 |      return util.import_app(self.app_uri)
6:36:34 PM web.1 |    File "/Users/Yann/Documents/dev/choposcope/env/lib/python2.7/site-packages/gunicorn/util.py", line 357, in import_app
6:36:34 PM web.1 |      __import__(module)
6:36:34 PM web.1 |  ImportError: No module named wsgi
6:36:34 PM web.1 |  [2016-12-01 18:36:34 +0100] [9919] [INFO] Worker exiting (pid: 9919)
6:36:34 PM web.1 |  [2016-12-01 18:36:34 +0100] [9916] [INFO] Shutting down: Master
6:36:34 PM web.1 |  [2016-12-01 18:36:34 +0100] [9916] [INFO] Reason: Worker failed to boot.
[DONE] Killing all processes with signal  null
6:36:34 PM web.1 Exited with exit code 3

另外,我不知道 wsgi 模块是否应该默认安装在烧瓶中。当我尝试在我的虚拟环境中运行 pip install mod_wsgi 时,我收到此错误:

pip install mod_wsgi
Collecting mod_wsgi
  Using cached mod_wsgi-4.5.9.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/private/var/folders/_1/bhy3l2kj5l36_859j956y87m0000gn/T/pip-build-h3zlPa/mod-wsgi/setup.py", line 284, in <module>
        APR_INCLUDES = get_apr_includes().split()
      File "/private/var/folders/_1/bhy3l2kj5l36_859j956y87m0000gn/T/pip-build-h3zlPa/mod-wsgi/setup.py", line 245, in get_apr_includes
        stdout=subprocess.PIPE, stderr=subprocess.PIPE)
      File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1335, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/_1/bhy3l2kj5l36_859j956y87m0000gn/T/pip-build-h3zlPa/mod-wsgi/

【问题讨论】:

  • 你是如何安装heroku的?
  • 不确定是什么让您认为您需要 Apache; Heroku 根本不使用它,开发中当然也不需要它。但是您没有提供几乎足够的信息让我们回答这个问题。你的项目结构是什么样的?你在虚拟环境中吗?你安装了哪些库?你的 procfile 里有什么?而且,最重要的是,full 错误回溯说明了什么?
  • 我添加了您要求的详细信息。一切都在同一个文件夹中。
  • 我按照此链接的说明安装了heroku:devcenter.heroku.com/articles/…

标签: python heroku flask wsgi


【解决方案1】:

在您提供的命令行中,gunicorn 期望您有一个名为:

choposcope/wsgi.py

您没有显示目录和文件的设置结构,但错误表明这样的文件不存在。

虽然有一种方法可以在 Heroku 上安装 mod_wsgi-express,但我不推荐它,因为该机制并未得到积极支持。

如果您打算使用 gunicorn 进行本地开发以匹配 Heroku 上使用的内容,您也不需要在那里安装 mod_wsgi-express,尽管如果您没有理由不能使用 mod_wsgi-express 进行开发想要作为 mod_wsgi-express(不是手动 Apache/mod_wsgi 配置)与其他可用选项一样容易进行本地开发。

不知道您使用的是什么文件系统结构,我猜您需要做的是将文件myapp.wsgi 重命名为wsgi.py。然后将Procfile更改为:

web: gunicorn wsgi --log-file -

wsgi 参数是 Python 模块名称,因此需要将文件称为 wsgi.py。使用 gunicorn 时,它期望 WSGI 应用程序入口点默认为 application。如果没有 wsgi.py 文件,您或许也可以侥幸逃脱并使用:

web: gunicorn choposcope:app --log-file -

至于为什么 pip install mod_wsgi 在您尝试本地安装时失败,这可能是由于在 MacOS X 上并且没有安装 Xcode 开发人员命令行工具。否则,您在 HomeBrew 中的 Apache httpd 安装损坏或不完整。

【讨论】:

  • 将名称更改为 wsgi.py 就可以了。非常感谢。
【解决方案2】:

您不必下载它,您必须创建它。

文件的内容必须是:

from yourapplication import app as application

有关更多信息,请参阅 Flask 文档:http://flask.pocoo.org/docs/0.11/deploying/mod_wsgi/#creating-a-wsgi-file

【讨论】:

  • 错误改变了,但仍然需要一个wsgi模块来导入。它应该在哪里?我不知道它是否应该默认安装在烧瓶中,但是如果我尝试在我的虚拟环境中运行 pip install mod_wsgi ,它会失败。我会将错误添加到帖子中。
猜你喜欢
  • 2016-01-02
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2018-03-10
  • 2015-03-18
相关资源
最近更新 更多