2017-04-27 158 views
4

我已經在運行El Capitan 10.11.6和Python 3.4的Mac上安裝了Python映射工具Cartopy。我可以使用Cartopy成功繪製一些地圖,但在某些情況下,Python內核會因分割錯誤11而死亡。生成一些 - 但不是全部時,Python 3.4崩潰 - 具有段錯誤的Cartopy映射11

我想要一個安裝程序,可以在需要時輕鬆從我的計算機中刪除。因此,我安裝了Python 3.4和使用fink必要的依賴關係:

$ fink install python34 
$ fink install gdal2 
$ fink install gdal2-dev 
$ fink install proj 
$ fink install libproj9 

我然後使用pyvenv創建的虛擬環境(但也試過的virtualenv和VENV)和活化它。

在激活的虛擬環境中,我使用PIP安裝:

$ pip install cython  # Successfully installed cython-0.25.2 
$ pip install numpy   # Successfully installed numpy-1.12.1 
$ pip install shapely  # Successfully installed shapely-1.5.17.post1 
$ pip install pyshp   # Successfully installed pyshp-1.2.10 
$ pip install pandas  # Successfully installed pandas-0.19.2 python-dateutil-2.6.0 pytz-2017.2 six-1.10.0 
$ pip install matplotlib # Successfully installed cycler-0.10.0 matplotlib-2.0.0 pyparsing-2.2.0 
$ pip install pillow  # Successfully installed olefile-0.44 pillow-4.1.0 
$ pip install pyepsg  # Successfully installed pyepsg-0.3.1 
$ pip install scipy   # Successfully installed scipy-0.19.0 
$ pip install OWSLib  # Successfully installed OWSLib-0.14.0 pyproj-1.9.5.1 requests-2.13.0 
$ pip install mock   # Successfully installed mock-2.0.0 pbr-3.0.0 
$ pip install nose   # Successfully installed nose-1.3.7 
$ pip install pep8   # Successfully installed pep8-1.7.0 
$ pip install jupyter  # Successfully installed MarkupSafe-1.0 appnope-0.1.0 backports-abc-0.5 bleach-2.0.0 decorator-4.0.11 entrypoints-0.2.2 html5lib-0.999999999 ipykernel-4.6.1 ipython-6.0.0 ipython-genutils-0.2.0 ipywidgets-6.0.0 jedi-0.10.2 jinja2-2.9.6 jsonschema-2.6.0 jupyter-1.0.0 jupyter-client-5.0.1 jupyter-console-5.1.0 jupyter-core-4.3.0 mistune-0.7.4 nbconvert-5.1.1 nbformat-4.3.0 notebook-5.0.0 pandocfilters-1.4.1 pexpect-4.2.1 pickleshare-0.7.4 prompt-toolkit-1.0.14 ptyprocess-0.5.1 pygments-2.2.0 pyzmq-16.0.2 qtconsole-4.3.0 simplegeneric-0.8.1 terminado-0.6 testpath-0.3 tornado-4.5.1 traitlets-4.3.2 typing-3.6.1 wcwidth-0.1.7 webencodings-0.5.1 widgetsnbextension-2.0.0 

上面似乎滿足所有在列出的Cartopy扶養要求:http://scitools.org.uk/cartopy/docs/v0.15/installing.html

然後我裝Cartopy,確保建立針對

pip install --global-option=build_ext --global-option="-I/sw/opt/libgeos3.5.0/include" --global-option="-L/sw/opt/libgeos3.5.0/lib" cartopy 
          # Successfully installed cartopy-0.14.2 

我既可以在Jupyt運行Python:(如果這是正確的術語)用Fink安裝了GEOS庫呃筆記本或在終端,它允許我導入Cartopy沒有錯誤。我從Cartopy網站下載了一些示例代碼來測試安裝。

下面的例子非常完美:

import matplotlib 
matplotlib.use("TkAgg") 
cartopy.crs as ccrs 
import matplotlib.pyplot as plt 
ax = plt.axes(projection=ccrs.Mollweide()) 
ax.stock_img() 
plt.show() 

至於這樣做代碼:

import os 
import matplotlib 
matplotlib.use("TkAgg") 
import matplotlib.pyplot as plt 

from cartopy import config 
import cartopy.crs as ccrs 

fig = plt.figure(figsize=(8, 12)) 

# get the path of the file. It can be found in the repo data directory. 
fname = os.path.join(config["repo_data_dir"], 
        'raster', 'sample', 'Miriam.A2012270.2050.2km.jpg' 
        ) 
img_extent = (-120.67660000000001, -106.32104523100001, 13.2301484511245, 30.766899999999502) 
img = plt.imread(fname) 

ax = plt.axes(projection=ccrs.PlateCarree()) 
plt.title('Hurricane Miriam from the Aqua/MODIS satellite\n' 
      '2012 09/26/2012 20:50 UTC') 

# set a margin around the data 
ax.set_xmargin(0.05) 
ax.set_ymargin(0.10) 

# add the image. Because this image was a tif, the "origin" of the image is in the 
# upper left corner 
ax.imshow(img, origin='upper', extent=img_extent, transform=ccrs.PlateCarree()) 
ax.coastlines(resolution='50m', color='black', linewidth=1) 

# mark a known place to help us geo-locate ourselves 
ax.plot(-117.1625, 32.715, 'bo', markersize=7, transform=ccrs.Geodetic()) 
ax.text(-117, 33, 'San Diego', transform=ccrs.Geodetic()) 

plt.show() 

但這種代碼導致內核崩潰:

import matplotlib 
matplotlib.use("TkAgg") 
import matplotlib.pyplot as plt 
import cartopy 

ax = plt.axes(projection=cartopy.crs.PlateCarree()) 

ax.add_feature(cartopy.feature.LAND) 
ax.add_feature(cartopy.feature.OCEAN) 
ax.add_feature(cartopy.feature.COASTLINE) 
ax.add_feature(cartopy.feature.BORDERS, linestyle=':') 
ax.add_feature(cartopy.feature.LAKES, alpha=0.5) 
ax.add_feature(cartopy.feature.RIVERS) 

ax.set_extent([-20, 60, -40, 40]) 

plt.show() 

時輸入代碼在終點線逐行,所有的線路都沒有問題,直到最後兩個輸入。

在命令行產生唯一的錯誤信息是:

Segmentation fault: 11 

有沒有人遇到的一個原因,爲此問題的解決方案?

+0

您是否可以將您正在查看的錯誤消息複製/粘貼到您的帖子末尾。這可能有助於他人識別問題。 – ajdawson

+0

唯一的消息是「分段錯誤:11」。已添加到問題。 – user1718097

回答

2

最後設法取得了一些進展,所以我會總結我的解決方案。它可能無法解決所有問題,但它確實解決了我最初遇到的問題。

我張貼的問題Cartopy GitHub的頁面(https://github.com/SciTools/cartopy/issues/879)在哪裏QuLogic提出瞭解決通過重新安裝勻稱的使用停止分段錯誤:

pip uninstall shapely; pip install --no-binary :all: shapely 

這確實停止了分段錯誤11,但在運行「的問題'代碼然後產生了一個錯誤,提示geos_c無法找到,即使它存在。確切的錯誤是:

OSError: Could not find lib geos_c or load any of its variants ['/Library/Frameworks/GEOS.framework/Versions/Current/GEOS', '/opt/local/lib/libgeos_c.dylib']. 

看來,代碼堅持在預定的位置尋找這個庫,並拒絕看看那裏芬克已經安裝了,即使我已經加入到位置,我的庫中的位置。 bash_profile文件。解決方案是在指向fink安裝庫的預定義位置創建一個符號鏈接。希望這是有道理的。 (見傑西布朗寧OSError geos_c could not be found when Installing Shapely)。

所以這裏是我的整個解決方案的總結,以防萬一它幫助別人。任何改進建議都會受到歡迎。

  1. 爲了記錄,我的設置是在iMac上運行的Mac OS 10.11.6(El Capitan)上的標準(非管理員)帳戶。不過,如果有必要,我也可以訪問管理員帳戶。

  2. 安裝版本的Python 3.6使用在python.org

  3. 作爲管理員提供的安裝程序,用Fink安裝gdal2,gdal2-dev的,libproj9,libgeos3.6.1。 (也用fink安裝python3.6,gdal-py36,freetype,freetype219,cairo,gsl,sqlite3和libspatialite7的一個版本,但不知道這些軟件包是否絕對有必要。)

  4. Python 3.6安裝在/圖書館/框架/ Python.framework /版本/ 3.6 /斌/ python3.6。創建使用-m VENV虛擬環境(稱爲venv36)如下:

在命令行:

$ mkdir <name_of_directory_for_virtual_env> 
$ cd <name_of_directory_for_virtual_env> 
$ /Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 -m venv venv36 
  • 在用戶帳戶,使用納米到可以編輯.bash_profile文件以包括路徑,其中安裝libgeos3.6.1芬克位置:
  • 在命令行:

    $ cd 
    $ nano .bash_profile 
    

    添加下列行來.bash_profile文件並保存(CTRL-O):

    GEOS_CONFIG="/sw/opt/libgeos3.6.1/bin/geos-config"; export GEOS_CONFIG 
    GEOS_DIR="/sw/opt/libgeos3.6.1"; export GEOS_DIR 
    
  • 激活所述虛擬環境和PIP安裝所需的軟件包。熊貓和jupyter包是可選的,但爲什麼你不想安裝它們?
  • 在命令行:

    $ cd <path_to_virtual_environment> 
    $ source venv36/bin/activate 
    
    (venv36) $ pip install cython 
    (venv36) $ pip install numpy 
    (venv36) $ pip install --no-binary :all: shapely 
    (venv36) $ pip install pyshp 
    (venv36) $ pip install pyproj 
    (venv36) $ pip install six 
    (venv36) $ pip install matplotlib 
    
    (venv36) $ export CPLUS_INCLUDE_PATH=/sw/include/gdal2/ 
    (venv36) $ export C_INCLUDE_PATH=/sw/include/gdal2/ 
    (venv36) $ pip install gdal 
    (venv36) $ pip install pillow 
    (venv36) $ pip install pyepsg 
    (venv36) $ pip install scipy 
    (venv36) $ pip install OWSLib 
    (venv36) $ pip install mock nose pep8 
    (venv36) $ pip install pandas 
    (venv36) $ pip install jupyter 
    
    (venv36) $ pip install --global-option=build_ext --global-option="-I/sw/opt/libgeos3.6.1/include" --global-option="-L/sw/opt/libgeos3.6.1/lib" cartopy 
    
  • 最後,添加一個符號鏈接在/ opt/local/lib目錄/(這是cartopy - 或一些其他軟件包 - 堅持尋找libgeos),它指向由fink安裝的libgeos庫(稱爲libgeos_c.1.dylib)。如果它尚不存在,可能需要創建/ opt/local/lib路徑(或它的位)。
  • 然後,在命令行:

    $ cd /opt/local/lib 
    $ sudo ln -s /sw/opt/libgeos3.6.1/lib/libgeos_c.1.dylib libgeos_c.dylib 
    

    就是這樣。在激活的虛擬環境中,打開jupyter-notebook。確保第一行包含如果你想在筆記本上繪製的地圖如下:

    %matplotlib inline 
    

    然後添加以下到下一個單元格:

    import cartopy 
    import matplotlib.pyplot as plt 
    
    ax = plt.axes(projection=cartopy.crs.PlateCarree()) 
    
    ax.add_feature(cartopy.feature.LAND) 
    ax.add_feature(cartopy.feature.OCEAN) 
    ax.add_feature(cartopy.feature.COASTLINE) 
    ax.add_feature(cartopy.feature.BORDERS, linestyle=':') 
    ax.add_feature(cartopy.feature.LAKES, alpha=0.5) 
    ax.add_feature(cartopy.feature.RIVERS) 
    
    ax.set_extent([-20, 60, -40, 40]) 
    
    plt.show() 
    

    當代碼運行時,它將會產生一個警告(Failed CDLL(/Library/Frameworks/GEOS.framework/Versions/Current/GEOS)),但它應該有希望,仍然會產生如下圖:

    Map produced by cartopy code

    所以,這是它。希望能幫助到你。任何意見或改進建議,將不勝感激。