Shapely: OSX: pemasangan pip dari shapely tidak berfungsi dengan geos

Dibuat pada 22 Sep 2016  ·  4Komentar  ·  Sumber: Toblerity/Shapely

Menginstal shapely melalui pip di OSX, dan kemudian mencoba menggunakan rutin di cartopy yang bergantung pada shapely menghasilkan kesalahan berikut dan kernel crash:

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

Dapat diperbaiki dengan menginstall dengan flag no-binary

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

Komentar yang paling membantu

Secara garis besar, masalahnya adalah DLL Neraka. Anda telah membuat cartopy dengan satu versi GEOS dan binari Shapely dibangun dengan versi GEOS lainnya (mungkin rilis yang sama, tetapi dikonfigurasi dan dikompilasi secara berbeda). Modul ekstensi dalam dua paket tidak kompatibel. Impor Shapely terlebih dahulu dan cartopy tidak dapat menggunakan pustaka dinamis GEOS yang disebabkan oleh Shapely untuk dimuat. Saya dapat berusaha untuk membuat Shapely lebih kompatibel, dan akan, tetapi ada batasan untuk ini dan banyak cara berbeda yang digunakan pengguna untuk menginstal GEOS di sistem mereka: macports, Homebrew, penginstal Kyngchaos. Menjadi kompatibel dengan semuanya akan sulit, terutama karena saya tidak memiliki keahlian yang hebat dengan penautan dinamis di OS X.

Menggabungkan GEOS ke dalam roda Shapely macosx memiliki begitu banyak manfaat bagi pengembang sehingga saya tidak ingin meninggalkannya. pip install shapely dan itu hanya berfungsi, tidak perlu menginstal GEOS secara terpisah. Manfaat yang sama yang dibawa oleh roda Numpy ke pengembang (meskipun GEOS kurang menguntungkan daripada deps C Numpy).

Solusinya adalah menginstal Shapely dengan --no-binary shapely (tidak harus :all: ), yang memungkinkan Anda membangun modul ekstensi Shapely menggunakan lib GEOS yang sama seperti yang Anda gunakan untuk membuat cartopy. Dengan demikian modul akan kompatibel.

Proyek seperti cartopy dapat menentukan

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

dalam file persyaratan pip untuk membantu. Saya juga berharap bahwa pengguna conda tidak akan memiliki masalah DLL ini selama pengembang paket conda melakukan hal yang benar.

Dalam jangka panjang, saya bertanya-tanya apakah cartopy tidak boleh memindahkan ketergantungan GEOS sepenuhnya ke Shapely atau menjual Shapely untuk memastikan kompatibilitas modul ekstensi.

Selanjutnya untuk saya:

  • Dokumentasikan masalah ini dengan jelas di wiki dan readme Shapely
  • Usulkan beberapa perubahan pada cartopy

Semua 4 komentar

@MarkWieczorek terima kasih atas laporannya. Bisakah Anda memberi tahu saya versi Shapely mana yang Anda miliki di sini? Roda biner Shapely untuk macosx yang saya unggah ke PyPI mungkin tidak akan berfungsi dengan baik dengan cartopy kecuali versinya >= 1.5.16.

Versi yang diunduh dari pip adalah 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)

Secara garis besar, masalahnya adalah DLL Neraka. Anda telah membuat cartopy dengan satu versi GEOS dan binari Shapely dibangun dengan versi GEOS lainnya (mungkin rilis yang sama, tetapi dikonfigurasi dan dikompilasi secara berbeda). Modul ekstensi dalam dua paket tidak kompatibel. Impor Shapely terlebih dahulu dan cartopy tidak dapat menggunakan pustaka dinamis GEOS yang disebabkan oleh Shapely untuk dimuat. Saya dapat berusaha untuk membuat Shapely lebih kompatibel, dan akan, tetapi ada batasan untuk ini dan banyak cara berbeda yang digunakan pengguna untuk menginstal GEOS di sistem mereka: macports, Homebrew, penginstal Kyngchaos. Menjadi kompatibel dengan semuanya akan sulit, terutama karena saya tidak memiliki keahlian yang hebat dengan penautan dinamis di OS X.

Menggabungkan GEOS ke dalam roda Shapely macosx memiliki begitu banyak manfaat bagi pengembang sehingga saya tidak ingin meninggalkannya. pip install shapely dan itu hanya berfungsi, tidak perlu menginstal GEOS secara terpisah. Manfaat yang sama yang dibawa oleh roda Numpy ke pengembang (meskipun GEOS kurang menguntungkan daripada deps C Numpy).

Solusinya adalah menginstal Shapely dengan --no-binary shapely (tidak harus :all: ), yang memungkinkan Anda membangun modul ekstensi Shapely menggunakan lib GEOS yang sama seperti yang Anda gunakan untuk membuat cartopy. Dengan demikian modul akan kompatibel.

Proyek seperti cartopy dapat menentukan

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

dalam file persyaratan pip untuk membantu. Saya juga berharap bahwa pengguna conda tidak akan memiliki masalah DLL ini selama pengembang paket conda melakukan hal yang benar.

Dalam jangka panjang, saya bertanya-tanya apakah cartopy tidak boleh memindahkan ketergantungan GEOS sepenuhnya ke Shapely atau menjual Shapely untuk memastikan kompatibilitas modul ekstensi.

Selanjutnya untuk saya:

  • Dokumentasikan masalah ini dengan jelas di wiki dan readme Shapely
  • Usulkan beberapa perubahan pada cartopy

Lihat juga #553.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat