GeoDjango GEOSException错误

时间:2013-09-05 19:03:18

标签: python django homebrew geodjango

尝试在我的机器上安装GeoDjango。我是Python的新手,并被带入一个对其他团队成员来说非常棘手的安装项目。我使用brew安装了Python 2.7和GEOS,并运行了PSQL 9.2.4,但在我尝试运行webserver时仍然遇到此错误:

__import__(name)
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site
packages/django/contrib/gis/geometry/backend/geos.py", line 1, in <module>
from django.contrib.gis.geos import (
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site
packages/django/contrib/gis/geos/__init__.py", line 6, in <module>
from django.contrib.gis.geos.geometry import GEOSGeometry, wkt_regex, hex_regex
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site
packages/django/contrib/gis/geos/geometry.py", line 14, in <module>
from django.contrib.gis.geos.coordseq import GEOSCoordSeq
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site-
packages/django/contrib/gis/geos/coordseq.py", line 9, in <module>
from django.contrib.gis.geos.libgeos import CS_PTR
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site-
packages/django/contrib/gis/geos/libgeos.py", line 119, in <module>
_verinfo = geos_version_info()
File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site
packages/django/contrib/gis/geos/libgeos.py", line 115, in geos_version_info
if not m: raise GEOSException('Could not parse version info string "%s"' % ver)
django.contrib.gis.geos.error.GEOSException: Could not parse version info string
"3.4.2-CAPI-1.8.2 r3921"

似乎无法在SO或网络上找到与此跟踪相关的任何内容。我认为这可能是一个正则表达式的失败?我目前正在尝试重新安装PSQL和GEOS以确定我是否可以运行它。

这是我的要求文件:

django==1.4
psycopg2==2.4.4
py-bcrypt==0.4
python-memcached==1.48
south==0.7.3

# Debug Tools
sqlparse==0.1.3
django-debug-toolbar==0.9.1
django-devserver==0.3.1

# Deployment
fabric==1.4

# AWS
# boto==2.1.1
django-storages==1.1.4
django-ses==0.4.1

# ECL
http://packages.elmcitylabs.com/ecl_django-0.5.3.tar.gz#ecl_django
http://packages.elmcitylabs.com/ecl_google-0.2.14.tar.gz#ecl_google
# https://packages.elmcitylabs.com/ecl_tools-0.3.7.tar.gz#ecl_tools
# https://packages.elmcitylabs.com/chargemaster-0.2.19.tar.gz
# https://packages.elmcitylabs.com/ecl_facebook-0.3.12.tar.gz#ecl_facebook
# https://packages.elmcitylabs.com/ecl_twitter-0.3.3.tar.gz#ecl_twitter

# Search
#https://github.com/elmcitylabs/django-haystack/tarball/issue-522#django-haystack
-e git+https://github.com/toastdriven/django-haystack.git#egg=django-haystack

pysolr==2.1.0-beta
# whoosh==2.3.2

# Misc
# PIL
# django-shorturls==1.0.1
# suds==0.4

django-mptt
sorl-thumbnail

stripe
pytz==2013b

9 个答案:

答案 0 :(得分:140)

这是我的解决方案(显然它很难看,就像我的英语,但有效)。 问题是版本字符串在RegEx中有一个不需要的空格。

错误说:

GEOSException:无法解析版本信息字符串“3.4.2-CAPI-1.8.2 r3921”

geos_version_info警告:

正则表达式应该能够解析版本字符串,例如 '3.0.0rc4-CAPI-1.3.3','3.0.0-CAPI-1.4.1'或'3.4.0dev-CAPI-1.8.0'

编辑此文件: site-packages / django / contrib / gis / geos / libgeos.py

寻找功能: geos_version_info

并更改此行:

ver = geos_version().decode()

使用此行:

ver = geos_version().decode().split(' ')[0]

答案 1 :(得分:18)

在最新的GEOS安装中,上述答案无效......但接近问题。

我将正则表达式更改为geos_version_info()的正上方: 从:

version_regex = re.compile(r'^(?P<version>(?P<major>\d+)\.(?P<minor>\d+)\.(?P<subminor>\d+))((rc(?P<release_candidate>\d+))|dev)?-CAPI-(?P<capi_version>\d+\.\d+\.\d+)$')

是:

version_regex = re.compile(r'^(?P<version>(?P<major>\d+)\.(?P<minor>\d+)\.(?P<subminor>\d+))((rc(?P<release_candidate>\d+))|dev)?-CAPI-(?P<capi_version>\d+\.\d+\.\d+).*$')

注意。*添加到正则表达式的末尾。

答案 2 :(得分:14)

我认为这又被打破了。我们的FreeBSD服务器最近升级导致了这个错误:

django.contrib.gis.geos.error.GEOSException: Could not parse version info string "3.6.2-CAPI-1.10.2 4d2925d6"

看起来Django&#39; libgeos.py中的正则表达式需要再次更新以解释这种不同的语法。 Nachopro的解决方案仍然是一种解决方法。

答案 3 :(得分:4)

截至去年3月左右,Django似乎是this has been fixed。另见Django bug 20036。因此升级到Django 1.5.4将解决问题。

答案 4 :(得分:3)

Brew刚刚发布了geos 3.8.0,它当然又打破了Django 1.11。 哦,以前通过升级运行的全新的自动清除功能非常有帮助地清除了以前的版本3.7.3,所以我没有brew switch geos 3.7.3

我最终使用this post来了解如何查找先前的版本号并提交哈希:

cd $( brew --prefix )/Homebrew/Library/Taps/homebrew/homebrew-core
git log -- Formula/geos.rb | less
# find the version you need in the file, copy its hash
brew unlink geos
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/<yourcommithash>/Formula/geos.rb

所有这些之后,由于某些原因,geos 3.7.3的下载未通过SHA256校验和验证...因此我最终尝试了3.7.2,该方法确实有效。

现在在Catalina上重新安装3.7.2的命令是:

brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/823b700ab61eeec57f34d50be2cc34a285fb5abc/Formula/geos.rb

答案 5 :(得分:2)

对于那些之前没有安装过3.6.1的人:

  1. brew unlink geos
  2. 使用brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/145b22e8330e094ee148861e72e26c03e73d34a1/Formula/geos.rb安装3.6.1。
  3. brew info geos应显示3.6.1已加星标: enter image description here

答案 6 :(得分:2)

如果由于任何原因无法自行编辑站点包,这个丑陋的 hack 为我做了,而不必对环境本身采取行动:

try:
    __import__('django.contrib.gis.geos.libgeos', fromlist=['version_regex'])
except Exception as e:
    import re
    att = __import__('django.contrib.gis.geos.libgeos', fromlist=['version_regex'])
    setattr(att, 'version_regex', re.compile(
      '^(?P<version>(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<subminor>\\d+))((rc(?P<release_candidate>\\d+))|dev)?-CAPI-(?P<capi_version>\\d+\\.\\d+\\.\\d+)( r\\d+)?( \\w+)?.*$'))
    assert str(type(e)) == "<class 'django.contrib.gis.geos.error.GEOSException'>", str(e)

它基于 JayCrossler's answer

更新

上面执行在 django.contrib.gis.geos.__init__.py 模块中找到的代码,该模块已经尝试使用有问题的部分,使上述解决方案无法使用(对于 python 2.7+)。这可以解决为:

import sys
try:
    import django.contrib.gis.geos.libgeos
except Exception as e:
    import re
    setattr(sys.modules['django.contrib.gis.geos.libgeos'],'version_regex', re.compile(
        '^(?P<version>(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<subminor>\\d+))((rc(?P<release_candidate>\\d+))|dev)?-CAPI-(?P<capi_version>\\d+\\.\\d+\\.\\d+)( r\\d+)?( \\w+)?.*$'))
    assert str(type(e)) == "<class 'django.contrib.gis.geos.error.GEOSException'>", str(e)

基本上我们直接对 sys.modules 中的模块进行操作,而不是尝试从另一个会失败的导入中获取它。

答案 7 :(得分:0)

这可以通过尝试以下方法来解决,

  

brew switch geos 3.6.1

答案 8 :(得分:0)

我通过使用https://postgresapp.com/downloads.html将PostGIS与Postgres一起安装解决了该问题。

  1. 安装PostGIS(2.2):brew install postgis
  2. 如果版本高于3.6.1,则要取消与geos的链接:Brew取消geos
  3. 安装Geos(3.6.1):brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/145b22e8330e094ee148861e72e26c03e73d34a1/Formula/geos.rb
  4. Switch geos版本(最新版本是3.7.2,Django 1.11.3不支持该版本):brew switch geos 3.6.1
  5. 登录数据库并创建postgis扩展名:CREATE EXTENSION postgis; 测试postgis扩展名:SELECT ST_Distance('LINESTRING(-122.33 47.606,0.0 51.5)':: geography,'POINT(-21.96 64.15)':: geography);
  6. 检查postgis版本:SELECT PostGIS_full_version();