Đặt tham số trong Script Tool bằng Python?


8

Tôi ghét phải làm phiền tất cả các bạn với cùng một vấn đề lặp đi lặp lại nhưng tôi gặp phải một vấn đề mới mỗi khi tôi thực hiện một thay đổi nhỏ đối với mã. Tất cả những gì tôi đã làm với mã dưới đây là để thay thế tên trường để phù hợp với lớp tính năng ban đầu. Bây giờ nó không hoạt động. Nó đã cho tôi

<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function. Failed to execute (Script).

Tôi đã thử thêm Thử / Ngoại trừ mã không cung cấp cho tôi bất kỳ thông báo lỗi nào nhưng cũng không cho tôi bất kỳ kết quả nào.

Tôi không chắc chuyện gì đang xảy ra? Bất kỳ trợ giúp để tìm ra điều này sẽ được rất nhiều đánh giá cao.

import arcpy, os
Try:
roadpath = arcpy.GetParameterAsText(0)
tablepath = arcpy.GetParameterAsText(1)

datapath = os.path.split(tablepath)[0]
tablename = os.path.split(tablepath)[1]
rows = arcpy.SearchCursor(roadpath,"FROMLEFT <> 0 AND TOLEFT <> 0","","STREET_NAME_ID;FROMLEFT;TOLEFT","STREET_NAME_ID A;FROMLEFT A;TOLEFT A")
arcpy.env.workspace = datapath

if arcpy.Exists(tablename):
    arcpy.DeleteRows_management(tablename)
else:
    arcpy.CreateTable_management(datapath,tablename,roadpath)
    arcpy.DeleteField_management(tablename,"SHAPE_Length")

irows = arcpy.InsertCursor(tablename)
first = True
for row in rows:
    if first:
        first = False
    else:
        GISID = row.GIS_ID
        stid = row.STREET_NAME_ID
        fl = row.FROMLEFT
        tl = row.TOLEFT
        if stid == prev_stid and fl <= prev_tl:
            irow = irows.newRow()
            irow.GIS_ID = prev_GISID
            irow.STREET_NAME_ID = prev_stid
            irow.FROMLEFT = prev_fl
            irow.TOLEFT = prev_tl
            irows.insertRow(irow)
            del irow
            irow = irows.newRow()
            irow.GIS_ID = GISID
            irow.STREET_NAME_ID = stid
            irow.FROMLEFT = fl
            irow.TOLEFT = tl
            irows.insertRow(irow)
            del irow
    prev_GISID = row.GIS_ID
    prev_stid = row.STREET_NAME_ID
    prev_fl = row.FROMLEFT
    prev_tl = row.TOLEFT
del rows, irows
except:
print arcpy.GetMessages()

Hi Sam, chào mừng bạn đến GIS.se :) Xem nếu đặt everthing từ rows =để irowsbao gồm trong một thử ... ngoại trừ khối đưa ra một thông báo lỗi hở hang hơn. Nó cũng sẽ hữu ích nếu bạn có thể đặt một mẫu dữ liệu và tập lệnh đầy đủ ở đâu đó ( minus.com là một nơi để chia sẻ công khai dễ dàng).
matt wilkie

Tôi đã sửa định dạng mã trong Q. của bạn. Một phần của thông báo lỗi đã bị các dấu ngoặc góc ăn. FYI, tát [ctrl] - [K] khi ở chế độ chỉnh sửa để tự động áp dụng định dạng mã cho văn bản đã chọn. Một khối được thụt vào bốn khoảng trắng và mã nội tuyến có dấu tích ngược: ` ` (ref)
matt wilkie

Về chỉnh sửa mới nhất của bạn, có vẻ như biến được xác định trên dòng thứ hai nên đọc tablepaththay vì tablename. Đây chỉ là một lỗi đánh máy diễn đàn hoặc nó thực sự như thế trong kịch bản? Lỗi cho thấy trước đây, vì vậy bạn có thể cung cấp các ví dụ về các giá trị bạn đang truyền cho cả hai tham số của mình không? Ngoài ra, bạn có một import arcpydòng ở đầu kịch bản của bạn?
blah238

Không có cách nào để chúng tôi gỡ lỗi này cho bạn - lấy PyScripter hoặc Python IDE khác và bắt đầu gỡ lỗi. Trái với những gì matt nói, nếu bạn loại bỏ thử / ngoại trừ, bạn sẽ nhận được một dấu vết ngăn xếp đầy đủ khi chương trình đánh bom, hy vọng sẽ dẫn bạn đến dòng lỗi. Bạn cũng có thể viết rõ ràng dấu vết ngăn xếp bằng cách sử dụng mô-đun truy nguyên nhưng có thể làm việc nhiều hơn là chỉ xóa / thử ngoại trừ. Xem thêm: blogs.esri.com/Dev/blogs/geoprocessing/archive/2008/12/01/... 2D00 -lỗi xử lý-trong-Python-script-tools.aspx
blah238

Vấn đề là độ dài của tên trường. Rõ ràng, python không thích tên trường dài (> 10 ký tự). Nó dường như đang làm việc bây giờ. Tôi sẽ thử một cái gì đó mới vào ngày mai và tôi chắc chắn tôi sẽ gặp phải một loạt vấn đề mới. Nhưng cảm ơn bạn đã góp ý. Tôi cần học cách gỡ lỗi script python. Bạn có biết tài nguyên nào không?
Sam

Câu trả lời:


4

Các tham số mà bạn hiện đang thiết lập không thực sự là tham số "đầu ra", vì chúng là các đối số chuỗi đơn giản cho các phương thức xử lý địa lý của bạn, không phải là đầu ra thực.

Có hai cách bạn có thể đi về điều này:

  1. Thay thế hai tham số "Vị trí đầu ra" và "Bảng đầu ra" bằng một tham số đầu ra duy nhất của loại Bảng để cung cấp đường dẫn đầy đủ cho bảng đầu ra và cập nhật logic tập lệnh của bạn để phân tích tham số này thành các thành phần đường dẫn cần thiết sử dụng os.path.splitkhi cần thiết cho chức năng xử lý địa lý bạn đang sử dụng.
  2. Thay đổi tham số "Vị trí đầu ra" và "Bảng đầu ra" thành tham số đầu vào (tôi cũng sẽ đổi tên "Bảng đầu ra" thành "Tên bảng đầu ra" để làm rõ rằng đó chỉ là tên của bảng chứ không phải đường dẫn đầy đủ đến nó). Tạo một tham số thứ tư mới của loại Đã tạo và sửa đổi ToolValidatorlớp của công cụ tập lệnh của bạn để đặt giá trị của nó sau khi tham số 2 và 3 được xác thực.

Phương pháp đầu tiên có lẽ là cách dễ dàng hơn - logic ToolValidator rất khó để lấy đúng và khó gỡ lỗi.

EDIT: Trên thực tế, có một tùy chọn thứ ba có thể hoạt động cho mục đích của bạn - nó giống như phương thức hai, nhưng thay vì sửa đổi ToolValidator, hãy gọi SetParameterAsTextở cuối tập lệnh của bạn để đặt giá trị của tham số dẫn xuất thứ tư. Tôi đã gặp sự cố với SetParameterAsText trong quá khứ về các công cụ tập lệnh được sử dụng trong ModelBuilder, nhưng hiện tại nó có thể được sửa.


2

Tôi cũng sẽ xem xét nhận xét tất cả các mã và in ra các giá trị tham số bạn đang truyền vào. Luôn luôn tốt để đưa vào một chút gỡ lỗi.

Đó cũng là một thực hành tốt, để kiểm tra parametsr khi chúng đến:

# First parameter is ID
ID = long(arcpy.GetParameterAsText(0))

# parameter is optional feature class prefix 
appPrefix = arcpy.GetParameterAsText(1)
if (not appPrefix) or (appPrefix == "#") or (len(appPrefix.strip()) == 0):
    appPrefix = ""

# Optional schema owner
schemaOwner = arcpy.GetParameterAsText(2)
if (not schemaOwner) or (schemaOwner == "#") or (len(schemaOwner.strip()) == 0):
    schemaOwner = ""
else:
    schemaOwner = schemaOwner + "."

# Optional workspace - for use with ArcGIS Desktop. No default.
workspace = arcpy.GetParameterAsText(3)
if (not workspace) or (workspace == "#") or (len(workspace.strip()) == 0):
    workspace = os.path.join(sys.path[0], connFile)

Một cái gì đó tương tự, sau đó đảm bảo bạn in ra các biến để bạn có thể thấy chúng:

arcpy.AddMessage("ID : " + str(Id))

hoặc là

print "ID : " + str(Id)

V.v. Bạn cần biết các giá trị sẽ không phải là rác, vì bạn sẽ luôn theo đuổi đuôi của mình.

Đặt hàng / cur trong một thử bắt cũng là một thực hành tốt.


0

Tôi đồng ý với blah, hướng của tất cả các tham số của bạn phải là "đầu vào". Ngoài ra, bạn đang chỉ định tham số công cụ 3 kiểu dữ liệu, bảng đầu ra, dưới dạng đối tượng tệp; thử cái này dưới dạng "bảng" hoặc "chuỗi".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.