如何使用py2exe打包arcpy腳本?

我們可以在ArcGIS之外調用arcpy站點包運行python獨立腳本,從而批量化任務提高工作效率。 如果可以把做好的腳本打包成exe是不是就更方便了呢?想想一鍵式處理也挺開心的。

Python打包的問題最早是在 ArcGIS知乎 中看到的,有人提問爲何打包失敗,我還有幸被邀請回答,雖然在這一塊我也是小白一枚。 後來,得空時也搜了下相關的資源,雖然大部分人持悲觀態度說arcpy不支持打包,但剛好有個帖子說可以實現,並且宣稱 “It can be done easily!”,那我就動手試試吧。

Step1 下載安裝Py2exe

Py2exe是一個Python工具發佈擴展包,可以用來將Python腳本轉化爲Windows的可執行程序,詳情看 官網 py2exe.org

下載Py2exe安裝程序,下載地址戳 這裏

ArcGIS Desktop使用的Python 2.7.x版本,可以對應下載安裝 py2exe-0.6.9.win32-py2.7.exe 這個32位的版本;如果你的機器上安裝 ArcGIS Desktop 64-bit Background Geoprocessing 補丁或者安裝了 ArcGIS Server產品,也可以下載安裝 py2exe-0.6.9.win64-py2.7.amd64.exe。 在這篇博客中,我就以 64位的包爲例來說明打包的過程。


Step2 編寫腳本文件準備打包

打包時需要有至少兩個腳本文件,一個是 setup_py2exe.py, 一個是執行實際任務的 HelloPy2exe.py 腳本文件。

看第一個腳本 setup_py2exe.py,包含如下兩行:

爲了打包時包含arcpy的資源,不要忘記如下options。

options = {"py2exe": {"excludes": ["arcpy"]}}  
setup(console=['HelloPy2exe.py'], options=options) 

來看第二個腳本 HelloPy2exe.py:

path.dirname(interpreter) 可以得到Python解釋器(python.exe)的路徑,並向 sys.path 添加site-packages目錄。

from site import addsitedir  
from sys import executable  
from os import path  
interpreter = executable  
sitepkg = path.dirname(interpreter) + "\\site-packages" 
print(sitepkg) 
addsitedir(sitepkg)

def main():
    # 這裏編寫實際需要執行的任務 

if __name__ == "__main__":
    print('Start Processing ...')
    main()
    raw_input("Enter enter key to exit...")


Step3 執行打包

爲了簡化打包過程,可以事先做個bat文件,放在與上述連個py文件相同的目錄:

python setup_py2exe.py.py py2exe
pause

如果提示python不是有效的應用程序,那麼python可以使用python.exe的絕對路徑(如:C:\Python27\ArcGISx6410.4\python.exe),或者在 windows的環境變量path中添加python.exe所在的路徑。

OK, 執行bat文件打包吧。


Step4 添加PTH文件

爲了使得exe程序可以使用arcpy的資源,需要在發佈後的dist目錄中增加 site-packages 文件夾,並增加 *.pth 文件,...\dist\site-packages\Desktop10.4_64bit.pth

以64位爲例,文件中需要包含如下路徑(我的ArcGIS Desktop是默認路徑安裝的,你要看好自己路徑哦):

C:\Program Files (x86)\ArcGIS\Desktop10.4\bin64
C:\Program Files (x86)\ArcGIS\Desktop10.4\ArcPy
C:\Program Files (x86)\ArcGIS\Desktop10.4\ArcToolBox\Scripts
C:\Python27\ArcGISx6410.4\Lib
C:\Python27\ArcGISx6410.4\Lib\site-packages

PS: 開頭提到的帖子中,沒有提到要增加 C:\Python27\ArcGISx6410.4\Lib 和 C:\Python27\ArcGISx6410.4\Lib\site-packages 這兩個路徑,我在執行exe時屢屢失敗,不得其解。 快要放棄的時候,經過和同事討論和測試,發現加上這兩個路徑,找不到 Numpy、Numbers等等包的錯誤就解決了,開心!


最後,執行exe即可,這個示例中僅對兩個數據進行投影變換,後面可以做些更復雜的工作。


後續思考

arcpy並不是一個免費的站點包,arcpy作爲ArcGIS產品的一部分,完全脫離ArcGIS產品是不行的! Import arcpy內部其實會默默地檢測產品許可的。 如果你沒有產品許可,可能會遇到 “RuntimeError:NotInitialized” 這樣的初始化失敗的錯誤。

就現在的測試結果而言,我打包好的exe,放到其他安裝有ArcGIS Desktop(64位python需要安裝ArcGIS Desktop 64-bit Background Geoprocessing 補丁),ArcGIS Server的機器上都是可以正常運行的。

後面我會再做一些更復雜的測試,有時間的話再放上來。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章