Как я могу исправить ошибку Geo Django OS: неопределенный символ? - PullRequest
4 голосов
/ 08 января 2020

У меня есть следующая ошибка с моим Django проектом после нескольких дней обновления yum a go

Traceback (most recent call last):
  File "manage.py", line 21, in <module>
    main()
  File "manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/core/management/__init__.py", line 357, in execute
    django.setup()
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/apps/config.py", line 211, in import_models
    self.models_module = import_module(models_module_name)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 994, in _gcd_import
  File "<frozen importlib._bootstrap>", line 971, in _find_and_load
  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 678, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/base.py", line 117, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/base.py", line 321, in add_to_class
    value.contribute_to_class(cls, name)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/models/options.py", line 204, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/__init__.py", line 28, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/utils.py", line 201, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib64/python3.6/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/postgis/base.py", line 6, in <module>
    from .features import DatabaseFeatures
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/postgis/features.py", line 1, in <module>
    from django.contrib.gis.db.backends.base.features import BaseSpatialFeatures
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/backends/base/features.py", line 3, in <module>
    from django.contrib.gis.db.models import aggregates
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/__init__.py", line 3, in <module>
    import django.contrib.gis.db.models.functions  # NOQA
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/functions.py", line 4, in <module>
    from django.contrib.gis.db.models.fields import BaseSpatialField, GeometryField
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/db/models/fields.py", line 3, in <module>
    from django.contrib.gis import forms, gdal
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/forms/__init__.py", line 3, in <module>
    from .fields import (  # NOQA
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/forms/fields.py", line 2, in <module>
    from django.contrib.gis.gdal import GDALException
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/__init__.py", line 28, in <module>
    from django.contrib.gis.gdal.datasource import DataSource
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/datasource.py", line 39, in <module>
    from django.contrib.gis.gdal.driver import Driver
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/driver.py", line 5, in <module>
    from django.contrib.gis.gdal.prototypes import ds as vcapi, raster as rcapi
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/prototypes/ds.py", line 9, in <module>
    from django.contrib.gis.gdal.libgdal import GDAL_VERSION, lgdal
  File "/home/joincic/GeoRouting/GeoRouting_2/lib/python3.6/site-packages/django/contrib/gis/gdal/libgdal.py", line 47, in <module>
    lgdal = CDLL(lib_path)
  File "/usr/lib64/python3.6/ctypes/__init__.py", line 343, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r

Проект работал корректно до обновления и пытается исправить установленную ошибку gdal 3.0.2, но он не работал

Я не знаю, нужна ли вам дополнительная информация о проекте или о виртуальной машине, если да, вы можете спросить меня, и я с радостью предоставлю вам любую информацию

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 05 марта 2020

В моем случае у yum было несколько включенных репозиториев pgdg, а библиотека gdal была установлена ​​из другой версии pg, как Postgis. После сокращения числа включенных репозиториев pgdg до одного (интересующей версии) и переустановки (или, что лучше, стирания и установки) полученных пакетов, я смог снова использовать pg с Postgis.

Как отключить репозитории, см. Как включить или отключить репозитории в CentOS . Связанный файл был в моем случае / etc / yum.repos.d / pgdg-redhat-all.repo

Смешанная ситуация с хранилищем уже существовала до обновления, и Postgis работал без проблем

[test@mytest ~]$ yum list installed | grep -i geos
geos37.x86_64                         3.7.2-2.rhel7                  @pgdg10
[test@mytest ~]$ yum list installed | grep -i gdal
gdal-libs.x86_64                      1.11.4-12.rhel7                @pgdg96
gdal30-libs.x86_64                    3.0.1-4.rhel7                  @pgdg10
[test@mytest ~]$ yum list installed | grep -i postgis
postgis24_96.x86_64                   2.4.8-5.rhel7                  @pgdg96
postgis24_96-client.x86_64            2.4.8-5.rhel7                  @pgdg96

[test@mytest ~]$ yum repolist enabled | grep -i Postgre
pgdg10/7/x86_64      PostgreSQL 10 for RHEL/CentOS 7 - x86_64              1,306
pgdg11/7/x86_64      PostgreSQL 11 for RHEL/CentOS 7 - x86_64              1,162
pgdg12/7/x86_64      PostgreSQL 12 for RHEL/CentOS 7 - x86_64                596
pgdg96/7/x86_64      PostgreSQL 9.6 for RHEL/CentOS 7 - x86_64             1,354


[test@mytest ~]$ psql
psql (9.6.15)

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \connect test
You are now connected to database "test" as user "test".
test=# CREATE EXTENSION postgis;
CREATE EXTENSION
test=# \connect postgres
You are now connected to database "postgres" as user "test".
postgres=# DROP DATABASE test;
DROP DATABASE

После yum update ситуация со смешанным репозиторием была расширена, и postgis создает проблемы. (grep ищет pgdg для обнаружения всех задействованных пакетов)

[test@mytest ~]$ yum list installed | grep -i pgdg
CGAL.x86_64                           4.7-1.rhel7.1                  @pgdg11
SFCGAL.x86_64                         1.3.1-2.rhel7                  @pgdg12
SFCGAL-libs.x86_64                    1.3.1-2.rhel7                  @pgdg12
gdal-libs.x86_64                      1.11.4-12.rhel7                @pgdg96
gdal30-libs.x86_64                    3.0.1-4.rhel7                  @pgdg10
geos37.x86_64                         3.7.2-2.rhel7                  @pgdg10
libgeotiff.x86_64                     1.4.0-1.rhel7.1                @pgdg11
libgeotiff15.x86_64                   1.5.1-2.rhel7                  @pgdg12
ogdi.x86_64                           3.2.0-4.rhel7.1                @pgdg11
ogdi41.x86_64                         4.1.0-2.rhel7                  @pgdg10
pgdg-redhat-repo.noarch               42.0-5                         @pgdg10
postgis24_96.x86_64                   2.4.8-5.rhel7                  @pgdg96
...
proj62.x86_64                         6.2.0-1.rhel7                  @pgdg10
[test@mytest ~]$ psql
...
test=# CREATE EXTENSION postgis;
ERROR:  could not load library "/usr/pgsql-9.6/lib/rtpostgis-2.4.so": /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r
test=# 

Я попытался переустановить Postgis, включив только один репозиторий pgpdg. Это не было переустановкой зависимых пакетов geos, gdal, proj. Поэтому я удалил все установленные пакеты и установил их снова.

[test@mytest ~]$ sudo yum erase CGAL geos37 proj62 proj49 ogdi41
[test@mytest ~]$ sudo yum install postgis24_96

[test@mytest ~]$ yum list installed | grep -i pgdg
CGAL.x86_64                           4.7-1.rhel7                    @pgdg96
SFCGAL.x86_64                         1.3.1-1.rhel7                  @pgdg96
SFCGAL-libs.x86_64                    1.3.1-1.rhel7                  @pgdg96
gdal30-libs.x86_64                    3.0.4-2.rhel7                  @pgdg96
geos38.x86_64                         3.8.0-1.rhel7                  @pgdg96
...
postgis24_96.x86_64                   2.4.8-8.rhel7                  @pgdg96

Это сложное изменение системы, убедитесь, что у вас есть резервная копия (например, снимок виртуальной машины). А также проверьте, работают ли другие зависимые установки (например, python shapely) с измененными библиотеками или требуют переустановки.

0 голосов
/ 29 апреля 2020

У меня была та же проблема с клиентом, и я выяснил причину. Поэтому, хотя ответ Ичуба хороший, я думаю, что стоит объяснить причину проблемы.

В моем случае ошибка проявляется так:

test=> SELECT PostGIS_Full_Version();
ERROR:  could not load library "/usr/pgsql-10/lib/rtpostgis-2.4.so": /usr/gdal30/lib/libgdal.so.26: undefined symbol: GEOSMakeValid_r
CONTEXT:  SQL statement "SELECT public.postgis_gdal_version()"
PL/pgSQL function postgis_full_version() line 33 at SQL statement

Решение просто:

# yum remove geos37

Объяснение того, что произошло:

Это стало следствием (незначительного) повышения с postgis24_10-2.4.6-3.rhel7.x86_64 до postgis24_10-2.4.8-9.rhel7.x86_64 ( репозиторий pgdg10), который установил gdal30-libs-3.0.4 и geos38-3.8.1-1 в качестве зависимостей.

Конечная причина проблемы заключается в том, что ранее установленная версия GEOS не была деинсталлирована:

# rpm -qa | grep geos
geos38-3.8.1-1.rhel7.x86_64
geos37-3.7.0-1.rhel7.x86_64

Теперь оба этих пакета имеют библиотеку libgeos_c.so.1, установленную в разных каталогах:

/usr/geos38/lib64/libgeos_c.so.1
/usr/geos37/lib64/libgeos_c.so.1

Оба пакета помещают свой каталог в путь к общей библиотеке, добавив файл конфигурации в /etc/ld.so.conf.d Таким образом, в результате мы получаем две библиотеки с одинаковыми именами в пути.

К сожалению, библиотека из GEOS 3.7 оказалась первой в пути поиска, поэтому libgdal.so.26 по ошибке загрузил ее, что приводит к наблюдаемому ошибка.

Кто виноват?

Мне кажется, есть две ошибки:

  1. Библиотека GEOS libgeos_c имеет разрыв ABI между версиями 3.7 и 3.8, но ему не удалось изменить основную версию библиотеки.

  2. Пакеты RPM PGDG не могут реализовать несовместимость между этими двумя пакетами GEOS. Они никогда не должны устанавливаться одновременно.

...