Развертывание приложения Flask в Heroku дает ошибку ImportError от psycopg2 - PullRequest
0 голосов
/ 07 ноября 2018

Недавно я изучаю Flask по книге "Flask Web Development". Когда я выполнил код и развернул его в Heroku, произошла следующая ошибка:

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

Тем не менее, это прекрасно работает локально. Я искал соответствующие вопросы о psycopg2, и я настроил версию psycopg2, но та же ошибка все еще происходит. Пожалуйста, как мне решить проблему?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

У меня была точно такая же проблема, когда я изучал "Flask Web Development". Я потратил целый день, пытаясь решить его, и в конце концов мне это удалось. Это не так сложно, как метод Андре С. Андерсена.

  1. Убедитесь, что вы находитесь на главной ветке. Не другие отрасли.

Книга является вторым изданием Flask Web Development Мигеля Гринберга. Глава 17. Развертывание. Когда вы работаете до 1007 * Развертывание с помощью git push . После git push heroku master загрузите приложение на пульт геройки. Приложение развернуто и запущено, но оно не будет работать правильно, поскольку команда развертывания, которая инициализирует таблицы базы данных, еще не выполнена. Вам нужно использовать

heroku run flask deploy

для создания базы данных по героку. Вот откуда возникла проблема.

Потому что в этот момент ваша ГИТ-репо ГЛАВА находится на 17c. Это еще не основная ветвь. Если вы сделаете коммит сейчас, это не изменит среду герою. Значение, когда вы делаете

git branch

Вы увидите:

(HEAD detached from 17c)
  master

Но это не то, что вы хотите. Не голова прикреплена к 17c. Вы хотите видеть только master

Что достигается с помощью

git checkout master

Тогда git branch покажет только главную ветвь. Поэтому вы можете вносить коррективы в проект и обновлять геройку. Делайте это, потому что вы в конечном итоге будете использовать git push to master branch. Я думаю, что вы можете сделать 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 будет работать без проблем (не знаю почему. Но я видел МНОГО дискуссий о стековере). Тогда,

git add . git commit -m "notes"

Как обычно.

git push heroku master

толчок к герою ветки мастера. Если вы не сделаете первый шаг, то git покажет Everything up-to-date. Поэтому не будет вносить изменения, потому что вы обязуетесь не осваивать. Теперь вы можете видеть, что git загружает psycopg2-бинарный файл.

Вы можете дважды проверить, что это действительно psycopg2-бинарный файл, открыв heroku bash, затем pip list. Вы увидите как psycopg2, так и psycopg2-бинарный файл. Теперь запустите python, вы можете импортировать psycopg2 без проблем.

Наконец-то. heroku run flask deploy. Voila!

Я застрял на первом шаге. Поскольку все изменения, которые я сделал с героем проекта, просто не обновляются.

0 голосов
/ 02 декабря 2018

У меня такая же проблема. Я решил это, заставив heroku очистить виртуальную среду python и переустановить файл requirements.txt, используя psycopg2>=2.7,<2.8 --no-binary psycopg2. Я должен признать, что это было немного похоже на магию, но для этого стоит предпринять следующие шаги:

  1. Используя Git Bash для Windows, я вошел в heroku с помощью heroku login.
  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, чтобы найти версию стека моей героки, которая для меня была heroku-18.
  7. Далее я поищу в Интернете для поддерживаемых версий python для heroku-18. Он сказал, что по умолчанию было python-3.6.6 (что я тогда предположил, что я работал), и некоторые другие.
  8. Затем я произвольно выбрал python-2.7.15 из списка и добавил этот текст в файл runtime.txt, который я поместил в корень папки моего проекта.
  9. Затем я зафиксировал и передал это моему gito-репозиторию heroko, и оно было развернуто. Это временно сломает сборку. Из того, что я понимаю, магия, стоящая за этим, заключается в том, что heroku теперь полностью уничтожает интерпретируемый python и окружение, поэтому никаких затерянных кэшированных файлов или чего-либо еще. Чистый сланец.
  10. Затем я вернул содержимое runtime.txt к значению по умолчанию python-3.6.6 и добавил обратно содержимое файла requirements.txt, убедившись, что сделанные мной изменения есть.
  11. Наконец, я зафиксировал и нажал на это, и мое приложение снова заработало.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...