共用 Python 指令碼的技術

來源:互聯網
上載者:User
文章目錄
  • Python 尋找模組的位置
  • 共用 Python 模組
 共用 Python 指令碼的技術

ArcGIS 10

以下將介紹一些您在與其他使用者共用 Python 指令碼時可使用的技術。

相對指令碼位置尋找資料

對於不以參數形式傳遞的現有資料,您的指令碼可能需要使用其路徑(程式員稱之為硬串連路徑)。例如,您可能需要將輸出參數的符號系統屬性設定為某個現有圖層檔案,或者需要將資料裁剪為某個已知資料集。

與其他使用者共用工具時,您需要確保指令碼能夠找到其所需資料。為此,建議您使用 ToolShare 檔案夾結構。您可以將工程資料和指令碼分別放在 ToolData 和 Scripts 檔案夾中。如果採用此方式,您始終可以相對於指令碼位置找到資料。

當運行指令碼時,可按照以下方法尋找該指令碼的路徑:

scriptPath = sys.path[0]

已知該位置後,您可以找到此位置對應的工程資料。以下程式碼片段示範了這個樣本:

import arcpyimport osimport sys# Get the pathname to this script#scriptPath = sys.path[0]arcpy.AddMessage("Script folder: " + scriptPath)# Get the pathname to the ToolShare folder#toolSharePath = os.path.dirname(scriptPath)arcpy.AddMessage("ToolShare folder: " + toolSharePath)# Now construct pathname to the ToolData folder#toolDataPath = os.path.join(toolSharePath, "ToolData")arcpy.AddMessage("ToolData folder: " + toolDataPath)# Create the pathname to the parks feature class found in the ToolData folder#parkPath = os.path.join(toolDataPath, "Project.gdb/Parks")arcpy.AddMessage("Parks feature class: " + parkPath)
注意:

如果嵌入指令碼代碼,則 sys.path[0] 將返回工具箱的位置(即代碼所在的位置)。

尋找臨時工作空間

如果要在指令碼中建立臨時資料,則需要一個臨時工作空間用於建立和後續刪除臨時資料。

以下是有關尋找臨時工作空間的注意事項:

  • 您需要具有此工作空間的寫入許可權。
  • 如果設定了臨時工作空間地理處理環境,則使用此環境,必須假定使用者已特意將其設定為可寫入的位置。對於在 ArcGIS 伺服器上啟動並執行地理處理服務,ArcGIS Server 會自動將臨時工作空間設定為可寫入的特定檔案夾。
  • 在將當前工作空間環境用作臨時工作空間時要謹慎,當前環境可能是一個遠端資料庫,而您從不希望使用遠端資料庫作為臨時位置,因為與遠端資料庫進行通訊的開銷非常大,會導致您無法快速建立、寫入和刪除臨時資料。
  • 如果尚設定臨時工作空間,則需要尋找一個可寫入的位置。在這種情況下,可選擇以下幾種方法:
    • 如果使用的是 ToolShare 檔案夾結構,則您可使用 Scratch 檔案夾中的 scratch.gdb。如果您採用的是防錯性編程,則應檢查 scratch.gdb 是否存在,因為使用者可能已將其刪除。
    • 如果某個指令碼參數為輸出資料集(如要素類),則可確定您對輸出資料集的位置具有寫入許可權,並可將其用作臨時工作空間。但您需要檢查該位置是要素資料集還是遠端資料庫。(如上所述,您從不希望將遠端資料庫用作臨時位置,因為與遠端資料庫進行通訊的開銷非常大,會導致您無法快速建立、寫入和刪除臨時資料。)
    • 當其他所有方法均失敗時,您始終可以使用系統的 temp 目錄。
  • shapefile 和個人地理資料庫工作空間中的要素類大小不得超過 2 GB。雖然 2 GB 能夠容納許多資料,但這仍是一個限制因素。檔案地理資料庫工作空間對於資料集的預設限制為一兆MB (1024 GB)。如果您認為臨時資料集的大小可能會超過 2 GB,則請使用檔案地理資料庫作為臨時工作空間。
  • 使用 CreateScratchName 函數在臨時工作空間中建立唯一資料集名稱。

以下程式碼範例顯示了尋找臨時工作空間的代碼執行,該程式極具防錯性。該代碼

  • 不使用當前工作空間作為臨時工作空間,如要使用,也很容易進行修改
  • 假定您使用 ToolShare 檔案夾結構
  • 嘗試尋找和使用檔案地理資料庫,並且除非必需,否則不使用 shapefile 工作空間
import arcpyfrom arcpy import envimport sysimport osdef getScratchWorkspace(outDataset):  # outDataSet is assumed to be the full pathname to a dataset. Typically,  #  this would be a tool's output parameter value.  #  # Get the scratch workspace environment. If it's set, just return it.  #  scratchWS = env.scratchWorkspace  if scratchWS:    return scratchWS   # Let's go fishing...  #  # If you're using the ToolShare folder structure, look for scratch.gdb in  #  the Scratch folder.  #  scriptPath      = sys.path[0]  toolSharePath   = os.path.dirname(scriptPath)  scratchWS       = os.path.join(toolSharePath, "Scratch/scratch.gdb")  if not arcpy.Exists(scratchWS):    scratchWS = ""  # No scratch workspace environment and no scratch.gdb in the ToolShare folder  #  if not scratchWS:    # Get the workspace of the output dataset (if any passed in)    #  by going up one level    #    if outDataset:      scratchWS = os.path.dirname(str(outDataset))      # If this isn't a workspace, go up another level and      #  test again.       #      desc = arcpy.Describe(scratchWS)      if desc.dataType.upper() <> "WORKSPACE":        scratchWS = os.path.dirname(scratchWS)        desc = arcpy.Describe(scratchWS)        if desc.dataType.upper() <> "WORKSPACE":          scratchWS = ""  # If we have a workspace, make sure it's not a remote (SDE) database.  #  If it is remote, set workspace to the system temp directory.  #  # If we don't have a workspace, just set it to the system temp directory.  #  usingTemp = False  if scratchWS:      desc = arcpy.Describe(scratchWS)      if desc.workspaceType.upper() == "REMOTEDATABASE":          scratchWS = arcpy.GetSystemEnvironment("TEMP")          usingTemp = True  else:      scratchWS = arcpy.GetSystemEnvironment("TEMP")      usingTemp = True  # If we're using the system temp directory (a shapefile workspace), look   #  for a scratch file geodatabase.  If it exists, use it.  If it doesn't,   #  create it.  #  if usingTemp:    scratchWS = os.path.join(scratchWS, "scratch.gdb")    if arcpy.Exists(scratchWS):      return scratchWS    else:      arcpy.CreateFileGDB_management(arcpy.GetSystemEnvironment("TEMP"),                                     "scratch.gdb")   return scratchWS# Main demonstration routine#  One optional input parameter, a feature class. #aDatasetpath = arcpy.GetParameterAsText(0)scratch = getScratchWorkspace(aDatasetpath)arcpy.AddMessage("Scratch workspace: " + scratch)# Create a scratch feature class in the scratch workspace#scrname = arcpy.CreateScratchName("temp", "","featureclass", scratch)arcpy.AddMessage("Scratch feature class is: " + scrname)arcpy.CreateFeatureclass_management(scratch, os.path.basename(scrname), "point")arcpy.AddMessage(arcpy.GetMessages())
共用 Python 模組

與任何一種現代程式設計語言類似,Python 允許您調用在其他 Python 指令碼中找到的常式。隨著對 Python 代碼的開發不斷深入,您可能會希望開發能在指令碼中共用的 Python 常式。本部分的目的即簡要介紹如何共用常式,並提供足夠的資訊,以便您能夠從官方 Python 網站 (http://www.python.org) 入手,有效地研究和實施常式的共用。

以下是指令碼 helloworld.py 的內容:

def dosomething():    print "Hello world"def somethingelse():    print "Goodbye world"

以下是指令碼 main.py 的內容:

import sys, os, helloworldhelloworld.dosomething()helloworld.somethingelse()

指令碼 main.py 匯入 helloworld 模組(該模組名稱即指令碼名稱去掉 .py 副檔名)以及 sys 和 os 模組。請注意,helloworld 中的 .py 副檔名不是必需的(實際上,是不允許的)。

helloworld.py 指令碼實施兩個稱為 dosomething 的常式(使用 def 語句),dosomething 列印出現較頻繁的“Hello world”,而 somethingelse 列印較少出現的“Goodbye world”。當執行 main.py 時,main.py 會調用這兩個常式來列印“Hello world”與“Goodbye world”。

以上所示的兩個模組缺少許多內容,如匯入 arcpy、擷取地理處理環境、錯誤處理等類似內容。在 Python 快速探索中涵蓋了所有這些主題。

Python 尋找模組的位置

當執行 main.py 時,import 指令會使 Python 在它的系統目錄路徑列表中尋找名為 helloworld.py 的檔案。Python 會首先在目前的目錄中尋找,即包含 import 指令的指令碼的目錄(在本例中為 main.py)。您可以使用以下代碼在互動式 PythonWin 視窗中顯示這些路徑的列表:

import syssys.path

不能在 import 指令中輸入路徑,如

import E:\SharedScripts\helloworld

而是必須更改 Python 尋找模組的目錄的列表。此目錄列表包含在名為 PYTHONPATH 的 Windows 環境設定中,由 ArcGIS 安裝。要更改此設定,請執行以下操作:

  1. 在 Windows“開始”菜單下,單擊設定 > 控制台。
  2. 找到“系統”檔案並將其開啟。
  3. 單擊進階選項卡,然後單擊環境變數。
  4. 在系統變數下,滾動至 PYTHONPATH 變數,然後單擊將其選中。
    • 如果不存在 PYTHONPATH 變數,則單擊建立。在變數名稱:文字框中,輸入 PYTHONPATH。
    • 在變數值:文字框中,輸入 <ArcGIS 安裝目錄>\bin;<ArcGIS 安裝目錄\arcpy(例如 C:\Program Files\ArcGIS\Desktop10.0\bin;C:\Program Files\ArcGIS\Desktop10.0\arcpy)。
    • 單擊確定。
  5. 如果存在 PYTHONPATH 變數,則單擊編輯。

    PYTHONPATH 內容中的第一個條目應該是 <ArcGIS 安裝目錄>\bin;<ArcGIS 安裝目錄\arcpy。這是 arcgisscripting 模組所在的位置。您可以追加更多指向包含 Python 模組的目錄的路徑。這些路徑以分號隔開且分號左右不能有任何空格。

您還可以通過以下方式在代碼中追加路徑

sys.path.append("e:\sharedmodules")
共用 Python 模組

如果要將指令碼工具提供給其他使用者,並且該指令碼需要匯入其他模組,您可以選擇以下兩種方法:

  1. 將所有指令碼放於同一目錄中。
  2. 通知使用者在其系統中的某個位置安裝其他模組並修改 PYTHONPATH 變數。

不建議使用 sys.path.append(),因為它要求使用者更改 Python 代碼。

路徑和逸出字元

基於 UNIX 的程式設計語言以及 C 程式設計語言與 Python 類似,都將反斜線 (\) 視為逸出字元。例如,\n 用於在寫入文本輸出時插入一個斷行符號符,而 \t 用於插入定位字元。如果指令碼中的路徑使用反斜線作為分隔字元,則 Python 會搜尋此分隔字元,並在遇到 \n 和 \t 時,分別將其替換為斷行符號符和定位字元。(除了 \n 和 \t 外,還有其他的逸出字元序列。)

防止此類狀況的最簡單方法是使用 r 指令將路徑轉換為 Python 原始字串,如下所示。這會指示 Python 忽略反斜線。

thePath = r"E:\data\teluride\newdata.gdb\slopes"

瞭解有關設定資料路徑的詳細資料

檢查許可

如果您的指令碼使用擴充模組,或所需工具在 ArcView 或 ArcEditor 產品層級上不可用,則需要先檢查許可和產品層級。

瞭解有關指令碼中的許可檢查的詳細資料

相關主題共用工具快速探索
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.