Depurando scripts do ArcPy?

50

Eu escrevi muitos scripts Python usando ArcPy no ArcGIS 10, e até agora meu único meio de depuração é restrito à impressão de mensagens na janela de resultados de geoprocessamento usando arcpy.AddMessage().

Existem outras opções por aí, como definir pontos de interrupção?

O método de Jason funciona muito bem. Se você tiver um bug na sua caixa de ferramentas, como a validação, o IDE provavelmente não poderá identificar o problema porque as caixas de ferramentas são codificadas. Pelo menos a WING não conseguiu identificá-lo.

Curtidor
fonte
Talvez uma opção aqui? código google pyscripter
Brad Nesom
Os ArcGIS ajuda discute como utilizar o depurador em PythonWin
Regan Sarwas
Nas propriedades do arquivo do sistema operacional, você tentou definir o programa padrão para arquivos .py como PyScripter?
KiloGeo
Ao fazer isso, eu não diria ao sistema operacional que não queria executar meu script python, mas apenas abri-lo no editor?
RyanDalton
Sim, correto. Desculpe, eu não entendi seu propósito.
KiloGeo #

Respostas:

37

Geralmente, os depuradores / IDEs do Python assumem que o script Python está sendo executado no mesmo processo que o próprio, portanto, a depuração de um script executado no ArcMap.exe está correta - você precisa obter o suficiente do ambiente de script GP inicializado em um script Python para poder depurar com.

Um método que funcionou muito bem para mim nos últimos anos é escrever um script simples que apenas chame a ferramenta e use-o como meu script principal no IDE do Python (Wing ou Pythonwin) e tenha meus pontos de interrupção definidos no arquivo .py da ferramenta O arquivo também é aberto na mesma sessão do IDE.

Então, basicamente, eu faço isso:

  1. Obter o conjunto de entradas que não estão funcionando na minha ferramenta de script
  2. Abra um arquivo .py simples na mesma pasta que o .tbx que chama a ferramenta
  3. Abra o script de chamada e o arquivo .py da ferramenta de script no IDE
  4. Definir pontos de interrupção no arquivo da ferramenta de script
  5. Execute o script de chamada

E meu script de chamada geralmente é bem simples:

import os
import arcpy
arcpy.ImportToolbox(os.path.join(os.path.dirname(__file__), 'my.tbx'))
arcpy.MyToolThatIsFailing_myalias("inputs", "that", "don't" "work")

Eu tentei o winpdb para depurar scripts em execução no ArcMap, mas nunca tive sorte. Se você quiser experimentá-lo e fazê-lo funcionar bem, compartilhe suas descobertas.

Jason Scheirer
fonte
11
boa solução! Eu vou tentar isso.
George Silva
Eu usei o winpdb com êxito no passado para depurar scripts de processos longos. O winpdb, uma vez configurado, permite que você "pule para dentro" de um script independente em execução no momento ou, teoricamente, dentro de outro processo, como o ArcMap, e depure-o normalmente. Isso foi muito útil para verificar um script que levaria semanas para ser concluído. Porém, eu não tentei depurar o arcpy em um processo de aplicativo do ArcGIS.
blah238
Eu recomendaria o PyCharm. funciona como mágica
user39901230
26

Você pode alterá-lo na caixa de diálogo Opções do GP, apenas aponte para o executável de sua escolha para editor / depurador.

Caixa de diálogo Configurações de GP

Jason Scheirer
fonte
Parece ser um novo aprimoramento para o ArcGIS 10, correto? Não vejo essa opção de configuração para 9.3.
precisa saber é o seguinte
Correto, novo no 10.
Jason Scheirer 07/04
9

Para usuários de 10 anos, claramente o melhor caminho a seguir é o post de Jason, que marquei como a "melhor resposta". Para os usuários da versão 9.3, fui capaz de seguir as instruções de suporte da ESRI KB vinculadas na postagem de Brad para fazê-lo funcionar.

Por fim, a chave para obter a edição padrão dos scripts python do ArcGIS no Pyscripter foi editar a "ação" do sistema para "tipos de arquivos registrados" que terminam em arquivos * .py (etapa 4). Criei um novo tipo de ação "Editar" e incluí o caminho do Pyscripter.exe. Depois disso, a ação de edição padrão foi configurada para iniciar o Pyscripter em vez do IDLE.

A string que usei (porque foi cortada na caixa de diálogo mostrada abaixo) é:

"C:\Program Files\PyScripter\PyScripter.exe" "%1"

insira a descrição da imagem aqui

RyanDalton
fonte
11
+1 para a resposta e, novamente, se possível, por incluir a sequência e não apenas uma imagem (o texto é muito mais fácil de copiar e colar!).
mate Wilkie
7

Não sei como isso funcionará com o arcpy, mas você pode tentar o pdb :

import pdb; pdb.set_trace()
nw1
fonte
existe uma funcionalidade semelhante para pydev com eclipse, descrita aqui. Você define o eclipse para escutar um sinal e pode acioná-lo no código que está sendo executado totalmente fora do eclipse por uma chamada de função pydevd.settrace (). urbansim.org/Documentation/DebuggingWithEclipse
ako
0

A maneira mais direta que encontrei para depurar meu código é codificar minhas entradas no caminho de arquivo de um conjunto de dados existente. Por exemplo:

import arcpy

# parameters for script
#input1 = arcpy.GetParameterAsText(0) # layer
#input2 = arcpy.GetParameterAsText(1) # folder

# debugging parameters
input1 = r"path/to/your/data.shp"
input2 = r"path/to/your/folder"

Além da janela de resultados, a janela python gera mensagens de erro úteis e / ou permite testar trechos de código.

Qualquer bom IDE possui um probe de depuração que terá, na memória, todo o seu processamento até o ponto de interrupção atual. Com isso, você pode ver o que está acontecendo com os dados. Defina pontos de interrupção nos quais deseja pausar o script. Use pontos de interrupção condicionais se desejar parar um loop em uma iteração específica. Além disso, conheça suas versões do Arc e quais funções estão disponíveis para essas versões.

gisdude
fonte