หากคุณกำลังใช้ Arcpy สคริปต์ประเด็นล็อคข้อมูลที่ได้กลายเป็นมากยิ่งขึ้นมีปัญหากับ 10.1
หากรหัสของคุณถูกล็อคคุณจะไม่ต้องล้างข้อมูลด้วยตัวเอง ปล่อยการอ้างอิงทั้งหมดไปที่คลาสคุณลักษณะพื้นที่ทำงานเคอร์เซอร์ ฯลฯ การล็อกจะถูกลบออกเมื่อคุณไม่มีการอ้างอิงไปยังวัตถุที่ถูกล็อคอีกต่อไป
นั่นเป็นวิธีที่มันควรจะทำงาน แต่ก็ไม่ค่อยได้ผล โดยปกติรหัสจะทำงานเป็นครั้งคราว แต่มักจะขัดข้องอย่างลึกลับในสถานที่ต่างกัน
ปัญหาดูเหมือนจะเป็นที่ล็อคเพิ่งนั่งอยู่ที่นั่น `ในขณะที่ 'แต่รหัสทำงานเร็วกว่าความเร็วที่ล็อคจะถูกลบออก อย่างไรก็ตามเครื่องมือ Arc inbuilt บางส่วนดูเหมือนจะบังคับให้ล็อคการล้างตามความต้องการ (เนื่องจากการล็อกจะใช้กับ GDB ทั้งหมดในครั้งเดียวการล็อคจะป้องกันไม่ให้คุณทำงานกับคลาสคุณลักษณะใด ๆ ที่มีอยู่) เครื่องมือเหล่านี้คือ arcpy.Compact_management () และ arcpy.Exists ()
นี่คือฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่ฉันใช้ภายในรหัสของฉันที่เพิ่มความน่าเชื่อถือได้อย่างมาก (สำหรับสคริปต์ที่สร้างและแก้ไข GDB และคลาสคุณลักษณะภายในหลายรายการ):
def clearWSLocks(inputWS):
'''Attempts to clear locks on a workspace, returns stupid message.'''
if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
return 'Workspace (%s) clear to continue...' % inputWS
else:
return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS
มันถูกใช้โดยเพียงแค่ผ่านเส้นทางพื้นที่ทำงาน (GDB) ไปยังฟังก์ชั่นและควรจะทำหลังจากการดำเนินการทุกครั้งในพื้นที่ทำงาน (เช่นการสร้าง GDB) หรือ Class Classes ภายในพื้นที่ทำงาน (เช่นเคอร์เซอร์เพิ่มเขตข้อมูลการคำนวณ ฯลฯ ) . ตัวอย่างเช่น (แสดงที่นี่เป็นสคริปต์แบบสแตนด์อโลนที่มีฟังก์ชันอยู่ด้านบนเพื่อใช้ฟังก์ชันคัดลอกและวางระหว่างการนำเข้าและโปรแกรมจริงดังแสดงที่นี่):
import arcpy
def clearWSLocks(inputWS):
'''Attempts to clear locks on a workspace, returns stupid message.'''
if all([arcpy.Exists(inputWS), arcpy.Compact_management(inputWS), arcpy.Exists(inputWS)]):
return 'Workspace (%s) clear to continue...' % inputWS
else:
return '!!!!!!!! ERROR WITH WORKSPACE %s !!!!!!!!' % inputWS
GDBpath = 'C:/Temp/'
GDBname = 'Test.gdb'
tableName = 'SweetFC'
arcpy.CreateFileGDB_management(GDBpath, GDBname)
print(clearWSLocks(GDBpath+GDBname))
arcpy.CreateTable_management(GDBpath+GDBname, tableName)
print(clearWSLocks(GDBpath+GDBname))
# etc....