我們可以在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的機器上都是可以正常運行的。
後面我會再做一些更復雜的測試,有時間的話再放上來。