6

我正在将 Heroku 与 python 和 Flask 一起使用。我的应用程序运行良好,直到我更新了我的 python 应用程序文件中的几行。该应用程序在本地运行良好,但是当我尝试访问我的应用程序时出现以下错误:

“应用程序发生错误,无法提供您的页面。请稍后再试。如果您是应用程序所有者,请查看您的日志以获取详细信息。”

我的日志看起来像这样:

2012-10-03T17:40:26+00:00 heroku[web.1]: Process exited with status 1
2012-10-03T17:40:26+00:00 heroku[web.1]: State changed from starting to crashed
2012-10-03T17:51:25+00:00 heroku[web.1]: State changed from crashed to starting
2012-10-03T17:51:26+00:00 heroku[web.1]: Starting process with command `python presentation.py`
2012-10-03T17:51:26+00:00 app[web.1]: ImportError: No module named site

我也不再能够通过heroku运行python:

Cinnas-MacBook-Pro:infinite-fortress-4866 cinna$ heroku run python
Running `python` attached to terminal... up, run.1
ImportError: No module named site

我尝试做的下一件事是检查我的环境变量:

Cinnas-MacBook-Pro:infinite-fortress-4866 cinna$ heroku config
=== infinite-fortress-4866 Config Vars
LANG:             en_US.UTF-8 
LD_LIBRARY_PATH:  /app/.heroku/vendor/lib
LIBRARY_PATH:     /app/.heroku/vendor/lib
PATH:             /app/.heroku/venv/bin:/bin:/usr/local/bin:/usr/bin
PYTHONHASHSEED:   random
PYTHONHOME:       /app/.heroku/venv/
PYTHONPATH:       /app/
PYTHONUNBUFFERED: true

但是,当我尝试查看库目录时,会得到如下信息:

Cinnas-MacBook-Pro:infinite-fortress-4866 cinna$ heroku run ls /app/.heroku/vendor/lib
Running `ls /app/.heroku/vendor/lib` attached to terminal... up, run.1
ls: cannot access /app/.heroku/vendor/lib: No such file or directory

我现在不知道从哪里开始。我想念我的应用程序,请帮助!

附加信息:

当我将以下几行添加到我的 app.py 代码中时,所有问题都开始了:

 @app.route('/my_fb_graph',methods=['GET','POST'])
 def my_fb_graph():
 return render_template('my_fb_graph.html')

当我推送代码并且应用程序不再工作时。然后我删除了这些代码行,再次推送代码,仍然得到相同的错误。我做的下一件事是完全删除 app.py 文件并尝试一个仍然不起作用的小测试代码。

问题的根源似乎是错误:

 2012-10-03T17:51:26+00:00 app[web.1]: ImportError: No module named site
4

3 回答 3

6

我能够解决问题,但仍然不知道为什么会首先发生!

经过大量的实验,我最终在 Heroku 上建立了一个全新的应用程序。我检查了新应用程序中的环境变量并得到以下信息:

 Cinnas-MacBook-Pro:thawing-temple-4323 cinna$ heroku config
 === thawing-temple-4323 Config Vars
 FACEBOOK_APP_ID:  ***
 FACEBOOK_SECRET:  ***
 PATH:             bin:/usr/local/bin:/usr/bin:/bin
 PYTHONUNBUFFERED: true

检查我的原始应用程序(损坏的应用程序),我意识到在我的最后一次推送中以某种方式添加了新的环境变量,如我的日志所示:

 2012-10-04T04:20:04+00:00 heroku[api]: Add PYTHONUNBUFFERED, PYTHONPATH, PYTHONHOME, LANG, LD_LIBRARY_PATH, PATH, PYTHONHASHSEED, LIBRARY_PATH config by ***@***

并通过检查我的环境变量:

 Cinnas-MacBook-Pro:infinite-fortress-4866 cinna$ heroku config
 === infinite-fortress-4866 Config Vars
 LANG:             en_US.UTF-8 
 LD_LIBRARY_PATH:  /app/.heroku/vendor/lib
 LIBRARY_PATH:     /app/.heroku/vendor/lib
 PATH:             /app/.heroku/venv/bin:/bin:/usr/local/bin:/usr/bin   
 PYTHONHASHSEED:   random
 PYTHONHOME:       /app/.heroku/venv/
 PYTHONPATH:       /app/
 PYTHONUNBUFFERED: true

我使用以下命令删除了这些新变量:

 heroku config:remove PYTHONPATH PYTHONHOME LANG LD_LIBRARY_PATH PYTHONHASHSEED LIBRARY_PATH

我的应用程序又开始工作了。我一直在推更多的代码,这个问题没有再发生过。

我仍然很好奇为什么/如何首先添加这些变量,因为我所做的只是做一个 git push。

于 2012-10-04T06:45:51.980 回答
6

昨天(2012 年 12 月 6 日)我遇到了一个非常相似的问题。出乎意料的是,每个 python 调用都因“ImportError: No module named site”而死。Heroku 支持今天回复了我,他们说它已经修复,因此不需要以下解决方法。我会把它留在这里,以防它帮助其他人诊断。

我检查了我的 heroku 配置变量,但没有设置 PYTHON* 变量。但是,它们在 shell 级别被设置为环境变量:

$ heroku run set | grep PYTHON
PYTHONHASHSEED=random
PYTHONHOME=/app/.heroku/venv/
PYTHONPATH=/app/
PYTHONUNBUFFERED=true 

/app/.heroku/venv 是一个不存在的目录。如果我用 config var 覆盖 PYTHONHOME,并指出我的 virtualenv 实际在哪里,它就会重新开始工作:

$ heroku config:set PYTHONHOME=/app

/app 似乎是项目根目录的挂载点。挖掘 Python buildpack 的历史,看起来当我开始我的项目时,每个人都在项目根目录中创建了他们的 virtualenvs。现在新项目在 venv/ 子目录中创建 virtualenvs。支持人员说他们正在逐步推出 buildpack 更改,我猜对旧的做事方式的检查对我来说并没有发挥作用。

这里是查找 buildpack 内部的地方: https ://github.com/heroku/heroku-buildpack-python/blob/master/bin/compile

于 2012-12-06T21:34:44.963 回答
2

这也咬到我了。我不确定它是什么时候开始的。我不相信这是对我的任何更改的回应,我今天刚刚在我的网站上注意到应用程序错误,并在日志中发现了这一点:

2012-12-12T16:02:06+00:00 heroku[web.1]: State changed from crashed to starting
2012-12-12T16:02:09+00:00 heroku[web.1]: Starting process with command `aspen --network_address=:40856 --www_root=doc/ --project_root=doc/.aspen`
2012-12-12T16:02:10+00:00 app[web.1]: ImportError: No module named site
2012-12-12T16:02:11+00:00 heroku[web.1]: Process exited with status 1
2012-12-12T16:02:11+00:00 heroku[web.1]: State changed from starting to crashed

我准备好了另一个版本,所以我像往常一样部署。之后git push heroku,该站点已备份。我heroku config没有上面列出的额外环境变量:

$ heroku config
=== aspen-io Config Vars
ASPEN_IO_SHOW_GA: yes
PATH:             bin:/usr/local/bin:/usr/bin:/bin
PYTHONUNBUFFERED: true

更新: @kennethreitz向我指出了一点

无法导入模块站点

当配置的环境变量与安装的 Python 的路径不匹配时,会发生这种情况。发生这种情况时,是因为有人在不了解上述含义的情况下清除了应用程序的缓存。

要修复,要么清除缓存并更新配置,要么恢复预期的配置(首选)。

于 2012-12-12T16:08:40.230 回答