Mengatur parameter di Script Tool menggunakan Python?

8

Saya benci bug Anda semua dengan masalah yang sama berulang-ulang tapi saya mengalami masalah baru setiap kali saya membuat sedikit perubahan pada kode. Yang saya lakukan pada kode di bawah ini adalah mengganti nama bidang agar cocok dengan kelas fitur asli. Sekarang tidak berfungsi. Itu memberi saya

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

Saya mencoba menambahkan Try / Kecuali ke kode yang tidak memberi saya pesan kesalahan tetapi tidak memberi saya hasil juga.

Saya tidak yakin apa yang terjadi? Setiap bantuan untuk mencari tahu ini akan sangat dihargai.

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()
Sam
sumber
Hai Sam, selamat datang di GIS.se :) Lihat apakah meletakkan everthing dari rows =ke irowsinklusif dalam percobaan ... kecuali blok memberikan pesan kesalahan yang lebih terbuka. Ini juga akan membantu jika Anda dapat menempatkan sampel data dan skrip lengkap di suatu tempat ( minus.com adalah salah satu tempat untuk berbagi publik yang mudah).
matt wilkie
Saya memperbaiki pemformatan kode di Q Anda. Bagian dari pesan kesalahan sedang dimakan oleh kurung sudut. FYI, tampar [ctrl] - [K] ketika dalam mode pengeditan untuk secara otomatis menerapkan pemformatan kode ke teks yang dipilih. Satu blok diberi indentasi empat spasi, dan kode sebaris dengan ` `
tanda centang
Mengenai mengedit terbaru Anda, sepertinya variabel didefinisikan pada baris kedua harus membaca tablepathbukan tablename. Ini hanya salah ketik forum atau apakah ini benar-benar seperti itu dalam skrip? Kesalahan menyarankan yang pertama, jadi dapatkah Anda memberikan contoh nilai yang Anda sampaikan ke kedua parameter Anda? Apakah Anda memiliki import arcpybaris di bagian atas skrip Anda?
blah238
Tidak ada cara bagi kami untuk men-debug ini untuk Anda - ambil PyScripter atau IDE Python lainnya dan mulai debugging. Berlawanan dengan apa yang dikatakan matt, jika Anda menghapus coba / kecuali, Anda harus mendapatkan jejak tumpukan penuh ketika program meledak, mudah-mudahan mengarahkan Anda ke garis kesalahan. Anda juga bisa secara eksplisit menulis jejak stack menggunakan modul traceback tetapi mungkin lebih banyak pekerjaan daripada hanya menghapus coba / kecuali. Lihat juga: blogs.esri.com/Dev/blogs/geoprocessing/archive/2008/12/01/... 2D00 -Penanganan- kesalahan -di-Python-script-tools.aspx
blah238
Masalahnya adalah panjangnya nama bidang. Tampaknya, python tidak suka nama bidang yang panjang (> 10 karakter). Tampaknya berfungsi sekarang. Saya akan mencoba sesuatu yang baru besok dan saya yakin saya akan mengalami serangkaian masalah baru. Tetapi terima kasih atas saran Anda. Saya perlu belajar cara men-debug skrip python. Apakah Anda tahu sumber daya apa pun?
Sam

Jawaban:

4

Parameter yang saat ini telah Anda atur seharusnya tidak benar-benar menjadi parameter "output", karena mereka adalah argumen string sederhana untuk metode geoprocessing Anda, bukan output yang sebenarnya.

Ada dua cara untuk melakukannya:

  1. Ganti dua parameter "Output Location" dan "Output Table" Anda dengan parameter output tunggal bertipe Table untuk memasok path lengkap ke tabel output, dan perbarui logika skrip Anda untuk mengurai parameter ini ke dalam komponen path yang diperlukan menggunakan os.path.splitsesuai kebutuhan untuk fungsi geoproses yang Anda gunakan.
  2. Ubah parameter "Output Location" dan "Output Table" Anda menjadi parameter input (Saya juga akan mengganti nama "Output Table" menjadi "Output Table Name" untuk mengklarifikasi bahwa itu hanya nama tabel, bukan path lengkap ke sana). Buat parameter keempat tipe baru Berasal dan modifikasi ToolValidatorkelas alat skrip Anda untuk menetapkan nilainya setelah parameter 2 dan 3 divalidasi.

Metode pertama mungkin adalah cara yang lebih mudah - logika ToolValidator rumit untuk dilakukan dengan benar dan sulit di-debug.

EDIT: Sebenarnya ada opsi ketiga yang dapat digunakan untuk tujuan Anda - ini sama dengan metode dua, tetapi alih-alih memodifikasi ToolValidator, panggil SetParameterAsTextdi akhir skrip Anda untuk menetapkan nilai parameter turunan keempat. Saya pernah mengalami masalah dengan SetParameterAsText di masa lalu dalam alat skrip yang digunakan dalam ModelBuilder, tetapi mungkin diperbaiki sekarang.

blah238
sumber
2

Saya juga melihat mengomentari semua kode dan mencetak nilai-nilai parameter yang Anda lewati. Selalu baik untuk dimasukkan ke dalam sedikit debugging.

Ini juga praktik yang baik, untuk memeriksa parametsr ketika mereka masuk:

# 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)

Sesuatu seperti itu, lalu pastikan Anda mencetak variabel agar Anda dapat melihatnya:

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

atau

print "ID : " + str(Id)

Dll. Anda perlu tahu bahwa nilai yang masuk bukan sampah, karena Anda akan selalu mengejar Anda.

Menempatkan baris / cur dalam tangkapan percobaan juga merupakan praktik yang baik.

Berbulu
sumber
0

Saya setuju dengan bla, arah semua parameter Anda harus "input". Juga, Anda menentukan parameter alat 3 tipe data, tabel output, sebagai objek file; coba ini sebagai "tabel" atau "string".

Jason
sumber