Shapely: OSX: pip install de shapely não funciona com geo

Criado em 22 set. 2016  ·  4Comentários  ·  Fonte: Toblerity/Shapely

Instalar shapely por meio de pip no OSX e, em seguida, tentar usar uma rotina em cartopia que depende de resultados shapely no seguinte erro e travamento do kernel:

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

O pode ser consertado instalando bem-feito com a bandeira no-binary

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

Comentários muito úteis

Em termos gerais, o problema é o DLL Hell. Você construiu cartopy com uma versão do GEOS e os binários do Shapely são construídos com outra versão do GEOS (talvez a mesma versão, mas configurada e compilada de forma diferente). Os módulos de extensão nos dois pacotes não são compatíveis. Importe o Shapely primeiro e o cartopy não será capaz de usar a biblioteca dinâmica GEOS que o Shapely fez com que fosse carregada. Eu poderia me esforçar para tornar o Shapely mais compatível, e o fará, mas há limites para isso e muitas maneiras diferentes de os usuários instalarem GEOS em seus sistemas: macports, Homebrew, os instaladores Kyngchaos. Ser compatível com todos eles seria difícil, especialmente porque não tenho grande experiência com links dinâmicos no OS X.

Agregar GEOS nas rodas Shapely do macosx tem tantos benefícios para os desenvolvedores que não quero abandoná-lo. pip install shapely e funciona, não há necessidade de instalar GEOS separadamente. O mesmo benefício que as rodas do Numpy trazem para os desenvolvedores (embora o GEOS seja menos problemático do que o C deps da Numpy).

A solução alternativa é instalar o Shapely com --no-binary shapely (não necessariamente :all: ), o que permitirá que você crie os módulos de extensão do Shapely usando a mesma biblioteca GEOS usada para construir o cartopy. Assim, os módulos serão compatíveis.

Projetos como cartopia podem especificar

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

em um arquivo de requisitos de pip para ajudar. Também espero que os usuários do conda não tenham esse problema de DLL enquanto os desenvolvedores do pacote conda fizerem a coisa certa.

A longo prazo, eu me pergunto se o cartopy não deveria mover sua dependência GEOS inteiramente para o Shapely ou vendorize Shapely para garantir a compatibilidade do módulo de extensão.

Próximo para mim:

  • Documente este problema claramente no wiki Shapely e leia-me
  • Propor algumas mudanças no cartopia

Todos 4 comentários

@MarkWieczorek obrigado pelo relatório. Você pode me dizer qual versão do Shapely você tem aqui? As rodas binárias Shapely para macosx que carreguei no PyPI provavelmente não funcionarão bem com cartopia, a menos que a versão seja> = 1.5.16.

A versão baixada do 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)

Em termos gerais, o problema é o DLL Hell. Você construiu cartopy com uma versão do GEOS e os binários do Shapely são construídos com outra versão do GEOS (talvez a mesma versão, mas configurada e compilada de forma diferente). Os módulos de extensão nos dois pacotes não são compatíveis. Importe o Shapely primeiro e o cartopy não será capaz de usar a biblioteca dinâmica GEOS que o Shapely fez com que fosse carregada. Eu poderia me esforçar para tornar o Shapely mais compatível, e o fará, mas há limites para isso e muitas maneiras diferentes de os usuários instalarem GEOS em seus sistemas: macports, Homebrew, os instaladores Kyngchaos. Ser compatível com todos eles seria difícil, especialmente porque não tenho grande experiência com links dinâmicos no OS X.

Agregar GEOS nas rodas Shapely do macosx tem tantos benefícios para os desenvolvedores que não quero abandoná-lo. pip install shapely e funciona, não há necessidade de instalar GEOS separadamente. O mesmo benefício que as rodas do Numpy trazem para os desenvolvedores (embora o GEOS seja menos problemático do que o C deps da Numpy).

A solução alternativa é instalar o Shapely com --no-binary shapely (não necessariamente :all: ), o que permitirá que você crie os módulos de extensão do Shapely usando a mesma biblioteca GEOS usada para construir o cartopy. Assim, os módulos serão compatíveis.

Projetos como cartopia podem especificar

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

em um arquivo de requisitos de pip para ajudar. Também espero que os usuários do conda não tenham esse problema de DLL enquanto os desenvolvedores do pacote conda fizerem a coisa certa.

A longo prazo, eu me pergunto se o cartopy não deveria mover sua dependência GEOS inteiramente para o Shapely ou vendorize Shapely para garantir a compatibilidade do módulo de extensão.

Próximo para mim:

  • Documente este problema claramente no wiki Shapely e leia-me
  • Propor algumas mudanças no cartopia

Veja também # 553.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

LostFan123 picture LostFan123  ·  5Comentários

ispmarin picture ispmarin  ·  3Comentários

akadouri picture akadouri  ·  4Comentários

jGaboardi picture jGaboardi  ·  5Comentários

FuriousRococo picture FuriousRococo  ·  5Comentários