Python GeoJango地理异常错误
正在尝试在我的机器上安装GeoDjango。我对Python真的是个新手,被带到一个对其他团队成员来说非常棘手的项目中。我使用brew安装了Python 2.7和GEOS,并运行PSQL 9.2.4,但在尝试运行Web服务器时,不断出现此错误:Python GeoJango地理异常错误,python,django,homebrew,geodjango,Python,Django,Homebrew,Geodjango,正在尝试在我的机器上安装GeoDjango。我对Python真的是个新手,被带到一个对其他团队成员来说非常棘手的项目中。我使用brew安装了Python 2.7和GEOS,并运行PSQL 9.2.4,但在尝试运行Web服务器时,不断出现此错误: __import__(name) File "/Users/armynante/Desktop/uclass-files/uclass-env/lib/python2.7/site packages/django/contrib/gis/geometry
__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"
这是我的解决方案(很明显,它很难看,就像我的英语一样,但很管用)。
问题是versions字符串在正则表达式中有一个不需要的空白
错误显示:
GEOSException:无法分析版本信息字符串“3.4.2-CAPI-1.8.2 r3921”
geos_版本信息警告:
正则表达式应该能够解析版本字符串,例如
“3.0.0rc4-CAPI-1.3.3”、“3.0.0-CAPI-1.4.1”或“3.4.0dev-CAPI-1.8.0”
编辑此文件:站点包/django/contrib/gis/geos/libgeos.py
查找功能:geos\u版本信息
并更改此行:
ver=geos\u version().decode()
使用此行:
ver=geos\u version().decode().split(“”)[0]
还有另一个问题,末尾有空格,但没有提供更多信息。这样的版本也与版本正则表达式不匹配,因此,
strip()
-ping该版本可能是一个快速修复的预期行为。在我的例子中,它是:'3.8.0-CAPI-1.13.1'
从去年3月左右开始,在Django。另见。因此,升级到Django 1.5.4将解决这个问题 在最新的GEOS安装中,上述答案不起作用。。。但这几乎就是问题所在
我更改了geos_version_info()上方的正则表达式:
发件人:
version\u regex=re.compile(r'^(?P(?P\d+)\(?P\d+)(?P\d+))((rc(?P\d+))| dev)?-CAPI-(?P\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+).*$')
version\u regex=re.compile(r'^(?P(?P\d+)\(?P\d+)(?P\d+))((rc(?P\d+))| dev)?-CAPI-(?P\d+\。\d+。。。。。*$)
请注意添加到正则表达式末尾的。*。我认为它又被破坏了。我们的FreeBSD服务器最近升级导致此错误:
django.contrib.gis.geos.error.GEOSException:无法分析版本信息字符串“3.6.2-CAPI-1.10.2 4d2925d6”
看起来Django的
libgeos.py
中的正则表达式需要再次更新以解释这种不同的语法。Nachopro的解决方案仍然是一个解决方案。这可以通过尝试以下方法来解决:
brew交换机geos 3.6.1
对于之前未安装3.6.1的用户:
brew取消链接geos
brew安装安装3.6.1https://raw.githubusercontent.com/Homebrew/homebrew-core/145b22e8330e094ee148861e72e26c03e73d34a1/Formula/geos.rb
brew信息地理信息系统
应显示3.6.1星号:
我通过使用安装PostGIS和Postgres修复了这个问题
Brew刚刚发布了geos 3.8.0,这当然再次打破了Django 1.11。 以前的版本3.7.3,现在升级时运行的全新全自动清理非常有用,因此我没有
brew switch geos 3.7.3
最后,我使用了解如何查找以前的版本号并提交哈希:
cd$(brew--前缀)/Homebrew/Library/Taps/Homebrew/Homebrew核心
git log——公式/geos.rb | less
#在文件中找到所需的版本,复制其哈希
brew取消链接geos
brew安装https://raw.githubusercontent.com/Homebrew/homebrew-core//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
如果出于任何原因不能自己编辑网站包,那么这个丑陋的黑客为我做到了,而不必对环境本身采取行动:
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)
基本上,我们是在
sys.modules
中直接对模块执行操作,而不是试图从另一个导入中获取该模块,这将失败。可能是您正在使用的构建的问题。尝试将其更新到更高版本。是的,我以前看过那张票。我现在正在重新安装它,如果不起作用,我会尝试升级到下一个版本。我的mac上也有同样的问题。不知道是什么引起的。如果你解决了,请发布解决方案。我用1.9 GDAL Kyung Khaos包和PSQL1.9重新安装了GEOS,错误消失了,所以很遗憾我无法测试。这对你有用吗,或者这只是一个建议?这对我有用,在ArchLinux更新后,我的django代码被破坏。在这个网站使用的版本中,was ver=geos_version(),谢谢!你是一个救命恩人我犯了给定的错误,我只将python从2升级到3,因为我的代码是用python 3编写的。我的问题解决了。我承认我最初的帖子是基于几个推论,但是现在来看,这不表明修正是在1.4.8中吗?不,那里的正则表达式将与有问题的版本号不匹配。恐怕只有1.5版本可以修复,正如上面@Kirkman14的回答中所提到的,这个版本被破坏了;具有讽刺意味的是,我正在尝试安装的项目是Django 1.5.4,但我在四年前发现的修复程序不是更新版本的libgeos的修复程序。好时光!这对我来说非常有效。但是,标记为接受的答案在我的设置中失败。此wo
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/823b700ab61eeec57f34d50be2cc34a285fb5abc/Formula/geos.rb
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)
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)