Shapely: OSX:匀称的 pip 安装不适用于 geos

创建于 2016-09-22  ·  4评论  ·  资料来源: Toblerity/Shapely

在 OSX 上通过 pip 安装 shapely,然后尝试在 cartopy 中使用依赖 shapely 的例程,导致以下错误和内核崩溃:

In [3]: ax.coastlines()
Out[3]: <cartopy.mpl.feature_artist.FeatureArtist at 0x1148419e8>

In [4]: Assertion failed: (0 != cs), function GEOSCoordSeq_getSize_r, file geos_ts_c.cpp, line 3797.
Abort

可以通过使用no-binary标志安装匀称来修复

pip install shapely --no-binary :all:
bug documentation

最有用的评论

从广义上讲,问题在于 DLL Hell。 您已经使用一个版本的 GEOS 构建了 cartopy,而 Shapely 的二进制文件是使用另一个版本的 GEOS 构建的(可能是相同的版本,但配置和编译方式不同)。 两个包中的扩展模块不兼容。 首先导入 Shapely,cartopy 无法使用 Shapely 导致加载的 GEOS 动态库。 我可以努力使 Shapely 更加兼容,并且会这样做,但是用户在他们的系统上安装 GEOS 的方式和许多不同的方式都有限制:macports、Homebrew、Kyngchaos 安装程序。 与所有这些兼容会很困难,特别是因为我对 OS X 上的动态链接没有很好的专业知识。

将 GEOS 捆绑到 macosx Shapely 轮子中对开发人员有很多好处,我不想放弃它。 pip install shapely就可以了,无需单独安装 GEOS。 与 Numpy 的轮子为开发人员带来的好处相同(尽管 GEOS 不如 Numpy 的 C deps 熊)。

解决方法是使用--no-binary shapely (不一定是:all: )安装 Shapely,这将允许您使用与构建 cartopy 相同的 GEOS lib 构建 Shapely 的扩展模块。 因此模块将是兼容的。

cartopy之类的项目可以指定

--no-binary shapely
shapely>=1.5.17
...

在 pip 要求文件中提供帮助。 我还希望 conda 用户不会遇到这个 DLL 问题,只要 conda 包开发人员做正确的事情。

从长远来看,我想知道 cartopy 是否不应该将其 GEOS 依赖完全转移到 Shapely 或供应商化 Shapely 以确保扩展模块兼容性。

接下来对我来说:

  • 在 Shapely wiki 和自述文件中清楚地记录此问题
  • 提出对 cartopy 的一些更改

所有4条评论

@MarkWieczorek感谢您的报告。 你能告诉我你这里有哪个版本的 Shapely 吗? 除非版本 >= 1.5.16,否则我上传到 PyPI 的适用于 macosx 的 Shapely 二进制轮可能无法与 cartopy 配合使用。

从pip下载的版本是1.5.17。

Collecting shapely
  Downloading Shapely-1.5.17-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (2.2MB)

从广义上讲,问题在于 DLL Hell。 您已经使用一个版本的 GEOS 构建了 cartopy,而 Shapely 的二进制文件是使用另一个版本的 GEOS 构建的(可能是相同的版本,但配置和编译方式不同)。 两个包中的扩展模块不兼容。 首先导入 Shapely,cartopy 无法使用 Shapely 导致加载的 GEOS 动态库。 我可以努力使 Shapely 更加兼容,并且会这样做,但是用户在他们的系统上安装 GEOS 的方式和许多不同的方式都有限制:macports、Homebrew、Kyngchaos 安装程序。 与所有这些兼容会很困难,特别是因为我对 OS X 上的动态链接没有很好的专业知识。

将 GEOS 捆绑到 macosx Shapely 轮子中对开发人员有很多好处,我不想放弃它。 pip install shapely就可以了,无需单独安装 GEOS。 与 Numpy 的轮子为开发人员带来的好处相同(尽管 GEOS 不如 Numpy 的 C deps 熊)。

解决方法是使用--no-binary shapely (不一定是:all: )安装 Shapely,这将允许您使用与构建 cartopy 相同的 GEOS lib 构建 Shapely 的扩展模块。 因此模块将是兼容的。

cartopy之类的项目可以指定

--no-binary shapely
shapely>=1.5.17
...

在 pip 要求文件中提供帮助。 我还希望 conda 用户不会遇到这个 DLL 问题,只要 conda 包开发人员做正确的事情。

从长远来看,我想知道 cartopy 是否不应该将其 GEOS 依赖完全转移到 Shapely 或供应商化 Shapely 以确保扩展模块兼容性。

接下来对我来说:

  • 在 Shapely wiki 和自述文件中清楚地记录此问题
  • 提出对 cartopy 的一些更改

另见#553。

此页面是否有帮助?
0 / 5 - 0 等级