Перекомпиляция Python Addin после редактирования скрипта?

15

Я разработал несколько дополнений Python, и мне просто интересно, как лучше перекомпилировать надстройку каждый раз, когда я редактирую скрипт.

В настоящее время, если я внесу изменения в сценарий, мне кажется, что я должен

  1. Закрыть ArcMap
  2. Перейдите в папку «Мои надстройки» и дважды щелкните файл python «makeaddin»
  3. Дважды щелкните по файлу надстройки Python
  4. Перезапустите ArcMap, чтобы изменения вступили в силу

Если я не сделаю эти шаги, то изменения не будут распознаны. Это становится довольно раздражающим и отнимает много времени, когда я хочу разместить где-нибудь простую строку для печати или я делаю небольшую правку, чтобы проверить результат.

Есть ли лучший способ сделать это?

Майк
источник

Ответы:

11

Вы можете использовать встроенную reloadфункцию в Python для автоматической перезагрузки вашего модуля. Что вы можете сделать, это что-то вроде этого:

import mymodule

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

где hook()- то, что вызывается ArcMap и mymoduleмодуль, который вы редактируете между вызовами. Возможно, вам придется отредактировать, sys.pathчтобы включить путь к редактируемому модулю, чтобы import mymoduleон не потерпел неудачу. Или включить каталог в site-packages(возможно, с помощью python setup.py develop).

CWA
источник
1
Конечно, это будет полезно только во время разработки; Я полагаю, что разработчики ArcGIS намерены протестировать ваш скрипт перед созданием надстройки ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
Это то, что я тоже делаю. Я также использую winpdb для встроенной отладки.
blah238
Спасибо за предложение. Это немного выходит за рамки моих навыков. Это сложно реализовать? Есть ли какая-либо дополнительная информация об этом, которую я могу использовать, чтобы изучить?
Майк
1
Я разработчик Python с ограниченным опытом работы с ArcGIS, но я изучаю его. Я уточню более подробную информацию после того, как выясню их.
cwa
@ blah238 как ты настроил встроенную отладку? Мой аддин подключится, но сбросит соединение после загрузки.
ShaunLangley
8

По предложению Per @ Blah238, следующий скрипт

  1. закрывает ArcMap (если открыт)
  2. создает надстройку
  3. устанавливает надстройку тихо
  4. повторно открывает документ ArcMap

Сохранить в каталог, содержащий 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)
Павел
источник
это включено в ваш файл PythonTool_addin.py?
ShaunLangley
@ShaunLangley, нет, это отдельный файл .py, находящийся в каталоге makeaddin.py
Пол
Отличный сценарий. Однако, как и ожидалось, ArcMap падает, когда скрипт пытается открыть файл .mxd за пределами ArcMap. Есть ли известное исправление к этому?
TheLastGIS
1
@TheLastGIS Да. Добавьте переменные arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"и Map = '"{0}" {1} /s'.format(arcmap, mapdoc)выше. Тогда os.system(Map)удастся, где os.system(mapdoc)нет.
alphabetasoup
2

Я получил ответ на сайте ArcGIS. По-видимому, это единственный способ перекомпилировать дополнения Python. Кто-то записал идею в ArcGIS Ideas, и я также проголосовал и прокомментировал.

Тема дискуссионного форума ArcGIS находится здесь .

Майк
источник
1
Не могли бы вы добавить соответствующие ссылки на ваш ответ?
blah238
Я хотел проголосовать, но не смог найти идею ArcGIS, о которой упоминает @Mike.
PolyGeo
Извините, я не видел этот ответ до сих пор. Спасибо @PolyGeo за обновление ссылки на сайт ArcGIS.
Майк
1

Я обычно использую два подхода: один для любых используемых вами инструментов, которые на самом деле являются просто геообработкой, позволяет импортировать их, а затем вы можете настроить интерактивный сеанс Python и сделать, reload(mymodule)как упоминалось, для включения самых последних изменений (или настроить автозагрузка в IPython ). Если вы просто вносите изменения в набор инструментов Python, вы можете перезагрузить набор инструментов, щелкнув по нему правой кнопкой мыши в представлении каталога и нажав «Обновить».

Для кода, который требует взаимодействия с пользователем в графическом интерфейсе, я использую следующий пакетный скрипт для ускорения процесса:

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

Где myaddin.mxd имеет слои данных и контекст, который я использую для конкретного проекта. Это запустит установку надстройки и ArcMap одновременно, но я обычно могу нажать кнопку «Установить надстройку» быстрее, чем запустится ArcGIS. Кроме того, вы можете добавить pauseперед последней командой ожидание ввода перед запуском ArcGIS.

SCW
источник
1
Вы можете использовать ESRIRegAddIn.exeс /sвыключателем, чтобы установить надстройку в автоматическом режиме. Путь к ESRIRegAddIn на моей машине есть C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238