简体   繁体   中英

gunicorn import error on heroku

I cannot run gunicorn on heroku with simple flask app the application is really simple, this 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)

the app works fine through flask test server on heroku when i switch to use gunicorn it crashs with:

ImportError: No module named app.wsgiapp

my requirements.txt:

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

i tried different versions of gunicorn from 0.13.7 to 0.14.6 with no success

Procfile:

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

running command:

heroku logs

gives

←[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__'])

Any help please

Thanks

Joe

In my case, I got this error by having a gunicorn.py file in my top level folder. This clashed with the installed gunicorn library on Heroku.

So my run command that caused the problem was:

gunicorn -c gunicorn.py myapp:main

Raising the following error:

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

Whereas after a mv gunicorn.py gunicorn_config.py it worked fine with:

gunicorn -c gunicorn_config.py myapp:main

I ran into this problem when upgrading Ubuntu to 14.04 LTS.

For some reason, gunicorn failed to pick up the correct python path to resolve the wsgi module.

I resolved this, for now, by declaring the python path explicitly to gunicorn via the --pythonpath parameter (documented here ).

For example:

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

I finally figured this one out.

It's basically just a PATH problem. If you import certain modules (like os and sys ) in the wrong order depending on your setup, you will cause Gunicorn to look in the wrong package for the app.wsgiapp module. (not to be confused with the app.wsgi_app function in Flask)

The correct import order will vary depending on your setup, but the rule of thumb based on what I was able to get working was to just make sure that your sys module is imported before your os module.

Beyond that, assuming the rest of the config is normal (as above) you shouldn't have any issues.

Note: THIS IS ONLY A PROBLEM ON HEROKU with Gunicorn. It has something to do with how their PYTHONPATH and module search path is set up. I don't know why exactly, but this is only necessary for the production environment, local setups will work fine regardless of the module import order.

My guess is there is an other "app" module in the python path (both gunicorn and flask have a module called app already). Rename it anything else than app.py and it should work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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