Heroku 上的 Gunicorn 'ImportError: No module named app.wsgiapp'

Posted

技术标签:

【中文标题】Heroku 上的 Gunicorn \'ImportError: No module named app.wsgiapp\'【英文标题】:Gunicorn 'ImportError: No module named app.wsgiapp' on herokuHeroku 上的 Gunicorn 'ImportError: No module named app.wsgiapp' 【发布时间】:2012-08-07 04:50:21 【问题描述】:

我无法使用简单的烧瓶应用在 heroku 上运行 gunicorn。 该应用程序非常简单。这是 app.py:

app = Flask(__name__)

@app.route("/")
def say_hello(url):
    return "Hello"


if __name__ == "__main__":
    port = int(os.environ.get('PORT', 8888))
    app.run(host='0.0.0.0',port=port)

该应用通过 heroku 上的烧瓶测试服务器运行良好,但是 当我切换到使用 gunicorn 时,它会崩溃:

ImportError: No module named app.wsgiapp

我的要求.txt:

Flask==0.8
gevent==0.13.7
gunicorn==0.13.2

我尝试了从 0.13.7 到 0.14.6 的不同版本的 gunicorn,但没有成功。

过程文件:

web: gunicorn app:app -w 4 -b 0.0.0.0:$PORT

运行这个命令:

heroku logs

给出这个:

←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m ImportError: No module named app.
wsgiapp ←[33m2012-08-09T21:08:02+00:00 app[web.1]:←[0m     entry = __import__(self.modul
e_name, globals(),globals(), ['__name__'])

有什么帮助吗?

【问题讨论】:

您是否尝试过较新的 gunicorn 版本,例如0.14.6 像 heroku 在他们的例子中指定? devcenter.heroku.com/articles/python/… 是的,没有任何改变 这不可能是整个 app.py 文件。从顶部添加导入。 @Joseph 你做了什么来解决这个问题?我现在也有同样的问题。我不知道为什么它用 gunicorn 从“工作”变成了“不工作”。 这里相同,可能是最简单的配置,并且在我切换到使用 gunicorn 配置文件之前它正在工作 【参考方案1】:

我在将 Ubuntu 升级到 14.04 LTS 时遇到了这个问题。

由于某种原因,gunicorn 未能选择正确的 python 路径来解析 wsgi 模块。

我现在解决了这个问题,方法是通过--pythonpath 参数(记录在here)显式地将python 路径声明为gunicorn

例如:

gunicorn --pythonpath /path/to/containing/directory "app.wsgi_app:wsgi_app"

【讨论】:

【参考方案2】:

在我的情况下,我的***文件夹中有一个 gunicorn.py 文件,我收到了这个错误。这与 Heroku 上已安装的 gunicorn 库发生冲突。

所以导致问题的运行命令是:

gunicorn -c gunicorn.py myapp:main

引发以下错误:

Traceback (most recent call last):
  File "/app/.heroku/python/bin/gunicorn", line 9, in <module>
    load_entry_point('gunicorn==18.0', 'console_scripts', 'gunicorn')()
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/app/.heroku/python/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
ImportError: No module named app.wsgiapp

而在 mv gunicorn.py gunicorn_config.py 之后,它可以正常工作:

gunicorn -c gunicorn_config.py myapp:main

【讨论】:

【参考方案3】:

我终于想通了。

这基本上只是一个 PATH 问题。如果根据您的设置以错误的顺序导入某些模块(如 ossys),您将导致 Gunicorn 为 应用程序查找错误的包.wsgiapp 模块。 (不要与 Flask 中的 app.wsgi_app 函数混淆)

正确的导入顺序将根据您的设置而有所不同,但根据我能够开始工作的经验法则是确保您的 sys 模块在您的 之前导入>os 模块。

除此之外,假设其余配置正常(如上),您应该没有任何问题。

注意:这只是 HEROKU 与 Gunicorn 的问题。这与他们的 PYTHONPATH 和模块搜索路径的设置方式有关。我不知道究竟是为什么,但这只是生产环境所必需的,无论模块导入顺序如何,本地设置都可以正常工作。

【讨论】:

【参考方案4】:

我的猜测是在 python 路径中还有一个“app”模块(gunicorn 和 flask 都有一个名为 app 的模块)。 将它重命名为 app.py 以外的任何其他名称,它应该可以工作。

【讨论】:

我不这么认为,因为当我将模块重命名为 another_app 之类的名称时,我得到了与新模块名称相同的错误 你能在 repr(app) 崩溃之前记录一个 PYTHON_PATH 环境变量吗? 怎么样? Gunicorn 本身正在崩溃......它甚至没有进入我的代码......任何代码片段来演示我该怎么做? 它会尝试访问 wsiapp,这是烧瓶应用程序的现有属性。所以你的代码必须被加载。只需在模块文件的正文中添加一些内容即可。还使用 --log-level=DEBUG 运行 gunicorn 这是我发现的情况,请参阅上面关于更改导入订单的回答。

以上是关于Heroku 上的 Gunicorn 'ImportError: No module named app.wsgiapp'的主要内容,如果未能解决你的问题,请参考以下文章

通过 Gunicorn 在 Heroku 上的 Django-twoscoops-project(骨架)。如何设置Procfile?

在heroku上找不到gunicorn

在 Heroku 上为 Django 配置 gunicorn

Heroku 上的 Django - 损坏的管理静态文件

如何调试使用 whitenoise、gunicorn 和 heroku 服务的 django 静态文件?

Heroku gunicorn 部署错误:NoModuleNameError