■ 廣東 張鵬 劉之良 秦超
編者按: 本文主要講述了在離線環境下的Linux終端上為Python語言安裝Basemap庫的過程,通過對遇到的問題進行分析和處理,希望對大家的使用有一些參考價值。
筆者在離線環境下Linux中為Python語言安裝Basemap庫,開始安裝之前,通過網上了解一些基本情況。由于Basemap庫需要大量的依賴,如Matplotlib、Numpy、PROJ4、GEOS等。考慮到由于需要安裝Basemap的計算機終端位于離線環境,無法通過pip在線安裝,因此選擇Anaconda解決方案。
Anaconda是一個開源的Python發行版本,其包含了Conda、Python等180多個科學包及其依賴。可以極大的降低數據可視化環境安裝的復雜程度。但是,Anaconda中不包含Basemap庫,需要另行安裝。

圖1 命令行窗口
由于需要離線安裝,第一步就是通過互聯下載相關軟件。下載包括Anaconda、Basemap、Pyproj等安裝文件。推薦到清華大學開源軟件鏡像站點下載,會比官網快很多,且有很多其他的包供選擇下載,上面提到的軟件基本都能找到。
第二步就是安裝Anaconda。運行安裝文件Anaconda3-5.3.1-Linuxx86_64.sh,這里選擇的基于python3.7的發行版本,畢竟python3才是未來的趨勢。安裝完成后,需要在”/etc/profile”添加環境變量,將安裝路徑下anaconda3/bin目錄添加到系統環境變量中。運行“python”,如圖1所示,說明Anaconda安裝正確。
第三步,安裝Basemap庫依賴。在安裝Basemap庫之前需要安裝 Goes、Pyshp和P y p r o j三個依賴。如果沒有安裝這些依賴項目,在執行“python setup install”時,會提示因為缺少依賴而中斷。這三個依賴項目中,goes可以在Basemap中找到源碼,可以通過編譯安裝。Pyshp和Pyproj是 Python包,可以通過在解壓目錄中執行“python setup.py install”來安裝。安裝完成后可以通過“pip list”命令查看相應庫安裝情況。第四步,安裝Basemap庫。進入Basemap解 壓 目 錄,執 行“python setup.py install”,完成安裝。
接下來就是測試一下安裝是否正常,在Python交互接口中輸入“from mpl_toolkits.basemap import Basemap”,發現報錯如圖2所示,提示沒有找到mpl_toolkits.basemap 模塊。

圖2 加載basemap報錯提示

圖3 pip show basemap信息
安裝完成后測試加載Basemap庫提示找不到對應模塊,難道是安裝失敗了?
通過在命令行中輸入“pip list | grep basemap”命令發現,該模塊已經被正常安裝。使用“pip info basemap”也可以查到相關信息,如圖3所示。
這里看到Basemap被安裝 到 了 Anaconda的“lib/python3.7/sit-packages”目錄中。egg文件類似于java程序的jar包,實際就是一組文件集合的壓縮包。打開egg文件發現里面存在mpl_toolkits/basemap的目錄結構。根據以上信息基本可以確認basemap安裝正常,那么是什么原因導致加載basemap包失敗呢?
這里又做了一個測試,在Python命令行中輸入“import mpl_toolkits”,發現能夠正常執行。這說明mpl_toolkits這個模塊是存在的,經過仔細檢查sitepackages目錄發現,在該目錄下竟然還存在一個mpl_toolkits的文件夾,里面有若干目錄。嘗試加載其中一個模塊“import mpl_toolkits.mplot3d”,發現該模塊可以正常加載。同時也發現該目錄中沒有Basemap模塊。難道是Python的查找順序導致Basemap的egg包沒有被檢索到導致加載Basemap庫失敗么?嘗試將egg包中mpl_toolkits中的Basemap目錄直接復制 到sit-packages/mpl_toolkits目錄中,再次測試發現Basemap庫可以正常加載了。使用官網樣例程序測試,可以正常繪圖。至此,整個安裝過程結束。
Python語言在聯網安裝時通過pip或是conda等在線安裝工具可以自動安裝依賴和軟件,極大的降低了環境安裝的復雜程度。在離線安裝環境下,anaconda會打包很多庫和依賴項。本例就是由于anaconda預安裝了一些模塊,致使site-packages中存在mpl_toolkits文件夾。調用basemap模塊時,由于mpl_toolkits文件夾會被優先檢索,導致查找不到egg包中的basemap模塊,引起調用失敗。相對成熟的商業項目,開源項目更加靈活,但是使用者需要更加仔細的分析,對底層知識有更加詳細的了解才能更好的發揮開源項目的優勢。