Eu odeio incomodar todos vocês com o mesmo problema repetidamente, mas encontro um novo problema sempre que faço uma pequena alteração no código. Tudo o que fiz no código abaixo foi substituir os nomes dos campos para corresponder à classe do recurso original. Agora não funciona. Deu-me
<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function.
Failed to execute (Script).
Tentei adicionar Try / Except ao código que não me deu nenhuma mensagem de erro, mas também não deu nenhum resultado.
Não tenho certeza do que está acontecendo? Qualquer ajuda para descobrir isso será muito apreciada.
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()
rows =
queirows
inclusive em um try ... exceto bloco dá uma mensagem de erro mais revelador. Também ajudaria se você pudesse colocar uma amostra dos dados e do script completo em algum lugar ( minus.com é um local para fácil compartilhamento público).` `
(ref)tablepath
vez detablename
. Isso é apenas um erro de digitação no fórum ou é realmente assim no script? O erro sugere o primeiro, então você pode fornecer exemplos dos valores que está passando para os dois parâmetros? Você também tem umaimport arcpy
linha na parte superior do seu script?Respostas:
Os parâmetros que você configurou atualmente não devem ser parâmetros de "saída", pois são argumentos simples de seqüência de caracteres para seus métodos de geoprocessamento, não saídas verdadeiras.
Há duas maneiras de fazer isso:
os.path.split
conforme necessário para o funções de geoprocessamento que você está usando.ToolValidator
classe da sua ferramenta de script para definir seu valor após a validação dos parâmetros 2 e 3.O primeiro método é provavelmente o caminho mais fácil - a lógica do ToolValidator é complicada de acertar e difícil de depurar.
EDIT: Na verdade, existe uma terceira opção que pode funcionar para seus propósitos - é o mesmo que o método dois, mas em vez de modificar o ToolValidator, chame
SetParameterAsText
no final do seu script para definir o valor do quarto parâmetro derivado. Eu tive problemas com o SetParameterAsText no passado nas ferramentas de script usadas no ModelBuilder, mas ele pode ser corrigido agora.fonte
Eu também gostaria de comentar todo o código e imprimir os valores dos parâmetros que você está passando. Sempre bom colocar um pouco de depuração.
Também é uma boa prática verificar os parâmetros quando eles entram:
Algo assim, certifique-se de imprimir as variáveis para poder vê-las:
arcpy.AddMessage("ID : " + str(Id))
ou
print "ID : " + str(Id)
Etc. Você precisa saber que os valores inseridos não são lixo, pois sempre estará perseguindo sua cauda.
Colocar a linha / curva em uma captura de tentativa também é uma boa prática.
fonte
Eu concordo com blá, a direção de todos os seus parâmetros deve ser "entrada". Além disso, você está especificando o tipo de dados do parâmetro 3 da ferramenta, a tabela de saída, como um objeto de arquivo; tente isso como uma "tabela" ou "string".
fonte