在 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:
@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 以确保扩展模块兼容性。
接下来对我来说:
另见#553。
最有用的评论
从广义上讲,问题在于 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之类的项目可以指定
在 pip 要求文件中提供帮助。 我还希望 conda 用户不会遇到这个 DLL 问题,只要 conda 包开发人员做正确的事情。
从长远来看,我想知道 cartopy 是否不应该将其 GEOS 依赖完全转移到 Shapely 或供应商化 Shapely 以确保扩展模块兼容性。
接下来对我来说: