Re-compilando o Python Addin após editar o script?

15

Estou desenvolvendo alguns suplementos python e estou me perguntando qual é a melhor maneira de recompilar o suplemento sempre que editar o script.

Atualmente, se eu fizer uma edição no script, parece que tenho que

  1. Fechar o ArcMap
  2. Vá para Minha pasta addin e clique duas vezes no arquivo python 'makeaddin'
  3. Clique duas vezes no arquivo 'Python Addin
  4. Reinicie o ArcMap para que as alterações entrem em vigor

Se eu não executar essas etapas, as edições não serão reconhecidas. Isso fica muito chato e demorado quando eu quero colocar talvez uma simples linha de impressão em algum lugar ou eu faço uma pequena edição apenas para testar um resultado.

Existe um jeito melhor de fazer isso?

Mike
fonte

Respostas:

11

Você pode usar a reloadfunção interna em python para recarregar automaticamente seu módulo. O que você pode fazer é algo como isto:

import mymodule

def hook():
    reload(mymodule)
    mymodule.myfunction()

onde hook()é chamado pelo ArcMap e mymoduleé o módulo que você está editando entre invocações. Você pode precisar editar sys.pathpara incluir o caminho do módulo que está editando, para que import mymodulenão falhe. Ou inclua o diretório em site-packages(talvez usando python setup.py develop).

cwa
fonte
1
Claro que isso só seria útil durante o desenvolvimento; Acredito que os designers do ArcGIS pretendam que você teste seu script antes de criar o complemento ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
Isto é o que eu faço também. Eu também uso o winpdb para depuração incorporada.
precisa saber é o seguinte
Obrigado pela sugestão. Isso está um pouco além do meu conjunto de habilidades. É difícil de implementar? Existe alguma informação adicional sobre isso que eu possa usar para aprender?
21413 Mike
1
Sou desenvolvedor python com experiência limitada no ArcGIS, mas estou aprendendo. Vou atualizar com mais detalhes depois de descobrir.
cwa
@ blah238 como você configurou a depuração incorporada? Meu suplemento se conectará, mas interromperá a conexão após o carregamento.
ShaunLangley
8

Por sugestão de @ blah238, o seguinte script

  1. fecha o ArcMap (se aberto)
  2. cria suplemento
  3. instala o suplemento silenciosamente
  4. reabre o documento do ArcMap

Salve no diretório que contém makeaddin.py:

import os

#Location of ESRIRegAddIn.exe
esri = "C:/Program Files (x86)/Common Files/ArcGIS/bin/ESRIRegAddIn.exe"
cwd = os.getcwd()
mapdoc = <path to mxd>

#Close ArcMap if it is open
try:    os.system("TASKKILL /F /IM ArcMap.exe")
except:    pass

#Create ESRI Add-in file
os.system(os.path.join(cwd, "makeaddin.py"))

#Silently install Add-in file. The name of the file is based on folder it's located in.
os.system('"{0}" {1} /s'.format(esri, os.path.split(cwd)[-1] + ".esriaddin"))

#Open test map document.
os.system(mapdoc)
Paulo
fonte
isso está incluído no seu arquivo PythonTool_addin.py?
perfil completo de ShaunLangley
@ShaunLangley, não este é um arquivo .py separado que reside no diretório de makeaddin.py
Paul
Ótimo roteiro. No entanto, como esperado, o ArcMap cai quando o script tenta abrir o arquivo .mxd fora do ArcMap. Existe uma correção conhecida para isso?
TheLastGIS
1
@TheLastGIS Sim. Adicione as variáveis arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"e Map = '"{0}" {1} /s'.format(arcmap, mapdoc)ao acima. Então os.system(Map)terá sucesso onde os.system(mapdoc)não.
alphabetasoup
2

Eu recebi uma resposta no site do ArcGIS. Aparentemente, esta é a única maneira de recompilar suplementos python. Alguém registrou uma idéia no ArcGIS Ideas e eu votei e comentei também.

O tópico do Fórum de Discussão do ArcGIS está localizado aqui .

Mike
fonte
1
Você poderia adicionar os links relevantes à sua resposta?
blah238
Eu queria votar, mas não consegui encontrar a idéia do ArcGIS mencionada pelo @Mike.
PolyGeo
Desculpe, não vi esta resposta até agora. Obrigado à PolyGeo por atualizar o link para o site do ArcGIS.
Mike
1

Geralmente, uso duas abordagens: uma é, para qualquer ferramenta usada que seja realmente apenas de geoprocessamento, permita que elas sejam importadas e, em seguida, você poderá configurar uma sessão interativa do Python e fazer o reload(mymodule)que foi mencionado para incluir as alterações mais recentes (ou configurar carregamento automático no IPython ). Se você está apenas fazendo alterações em uma caixa de ferramentas Python, pode recarregá-la clicando com o botão direito do mouse na visualização Catálogo e clicando em 'Atualizar'.

Para código que requer interação do usuário na GUI, eu uso o seguinte script em lote para acelerar o processo:

@echo off
echo building...
python makeaddin.py
echo installing...
start myaddin.esriaddin
echo load ArcMap...
start %HOMEDRIVE%%HOMEPATH%\Documents\ArcGIS\myaddin.mxd

Onde myaddin.mxd tem camadas de dados e contexto que eu uso para o projeto específico. Isso acionará a instalação do complemento e o ArcMap simultaneamente, mas geralmente posso clicar no botão 'Instalar suplemento' mais rapidamente do que o ArcGIS inicia. Como alternativa, você pode adicionar pauseantes do último comando para aguardar a entrada antes de iniciar o ArcGIS.

scw
fonte
1
Você pode usar ESRIRegAddIn.execom a /sopção para instalar o suplemento silenciosamente. O caminho para ESRIRegAddIn na minha máquina é C:\Program Files (x86)\Common Files\ArcGIS\bin.
precisa saber é o seguinte