将Flask应用程序部署到Heroku会从psycopg2提供ImportError

时间:2018-11-07 08:46:49

标签: python heroku flask psycopg2

最近,我正在通过《 Flask Web开发》一书学习Flask。当我完成代码并将其部署到Heroku时,发生了以下错误:

String

但是,这在本地可以正常工作。我已经搜索了有关JText的相关问题,并且已经调整了ImportError: /app/.heroku/python/lib/python3.6/ sitepackages/psycopg2/.libs/libresolv-2-c4c53def.5.so: symbol __res_maybe_init version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference 的版本,但是仍然发生相同的错误。拜托,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我通过强制heroku清理python虚拟环境并使用requirements.txt重新安装psycopg2>=2.7,<2.8 --no-binary psycopg2文件来解决此问题。我必须承认,它的感觉有点像魔术,但是对于我来说,这里采取的步骤对于它的价值是什么:

  1. 使用Windows的Git Bash,我用heroku login登录到heroku。
  2. 接下来,我导航到我正在处理的git / project文件夹的根文件夹。
  3. 我确保通过运行requirements.txt更新了venv/Scripts/pip freeze > requirements.txt。您可能必须找到自己的python /虚拟环境路径。
  4. 接下来,我将psycopg2的行/条目更改为psycopg2>=2.7,<2.8 --no-binary psycopg2
  5. 然后将requirements.txt文件的所有内容保存到我的桌面,确保项目文件夹中的所有内容为空。不知道此步骤是否必要。但这就是我所做的,所以我只想在这里提及。
  6. 现在,在Git Bash终端中,我运行heroku apps:info -a blogglistene来查找myoku堆栈的版本,该版本对我来说是heroku-18
  7. 接下来,我look onlineheroku-18提供了受支持的python版本。它说默认值是python-3.6.6(然后假定是我正在运行的那个),还有其他一些。
  8. 然后我从列表中任意选择python-2.7.15,并将该文本添加到runtime.txt文件中,该文件放置在项目文件夹的根目录中。
  9. 接下来,我提交并推送到了我的heroko git repo,并对其进行了部署。这将暂时中断构建。据我了解,其背后的魔力在于heroku现在完全破坏了python解释和环境,因此没有残留的缓存文件或任何东西。清理板岩。
  10. 然后,我将runtime.txt的内容还原为默认的python-3.6.6,并添加回requirements.txt文件的内容,确保所做的更改在那里。
  11. 最后,我提交并推动了此操作,并且我的应用程序已备份并运行。

答案 1 :(得分:0)

我在学习“ Flask Web开发”时遇到了完全相同的问题。我花了一天的时间来尝试解决它,最终成功。它并不像AndréC. Andersen的方法那么复杂。

  1. 确保您在master分支上。没有其他分支机构。

这本书是Miguel Grinberg撰写的Flask Web Development的第二版。第17章。部署。当您一直工作到使用git push部署之前。在git push heroku master之后,将应用程序上传到heroku遥控器。现在已部署并运行了该应用程序,但由于尚未执行初始化数据库表的deploy命令,因此该应用程序将无法正常工作。您需要使用

heroku run flask deploy

在heroku上创建数据库。这就是问题的根源。

因为此时您的git repo HEAD在17c处。还不是master分支。如果您现在进行任何更改,它将不会更改heroku环境。这样做的意义

git branch

您将看到:

(HEAD detached from 17c)
  master

但这不是您想要的。没有连接到17c的头部。您只想看到master

哪个成就

git checkout master

然后git branch将仅显示master分支。因此,您可以对项目进行调整,heroku将会更新。这样做是因为您最终将git push到master分支。我认为您可以git push到其他分支以使heroku工作,但我不知道该怎么做。

  1. psycopg2==2.7.3更改为psycopg2-binary==2.8.3

因为psycopg2 2.7.3将给您GLIBC_PRIVATE错误。 (您可以通过heroku run bash进行检查,然后启动python,导入psycopg2,如果heroku依赖性为2.7.3,则将看到相同的错误。)

现在,将您的需求/heroku.txt(heroku环境依赖性)行psycopg2==2.7.3更改为psycopg2-binary==2.8.3。出于某种原因,psycopg2的二进制版本可以正常工作(不知道为什么。但是我看到了很多有关stackover的讨论)。然后,

git add . git commit -m "notes"

照常。

git push heroku master

推送到heroku master分支。如果您不执行第一步,则git将显示Everything up-to-date。因此不会进行更改,因为您承诺不掌握。现在您可以看到git正在下载psycopg2-binary。

您可以通过打开heroku bash,然后pip list再次检查它确实是psycopg2-binary。您将同时看到psycopg2和psycopg2-binary。现在启动python,您可以毫无问题地导入psycopg2。

最后。 heroku run flask deploy。瞧!

我坚持第一步。由于我对heroku项目所做的任何更改都不会更新。