Mengkompilasi ulang Python Addin setelah mengedit skrip?

15

Saya telah mengembangkan beberapa python addins dan saya hanya ingin tahu apa cara terbaik untuk mengkompilasi ulang addin kapan saja saya mengedit skrip.

Saat ini, jika saya mengedit naskah, sepertinya saya harus melakukannya

  1. Tutup ArcMap
  2. Buka folder addin Saya dan klik dua kali file python 'makeaddin'
  3. Klik dua kali file 'Python Addin
  4. Mulai ulang ArcMap agar perubahan mulai berlaku

Jika saya tidak melakukan langkah-langkah ini, maka pengeditan tidak dikenali. Ini menjadi sangat mengganggu dan memakan waktu ketika saya ingin menempatkan mungkin garis cetak sederhana di suatu tempat atau saya melakukan edit kecil hanya untuk menguji hasilnya.

Apakah ada cara yang lebih baik untuk melakukan ini?

Mike
sumber

Jawaban:

11

Anda dapat menggunakan reloadfungsi builtin dalam python untuk secara otomatis memuat kembali modul Anda. Yang dapat Anda lakukan adalah sesuatu seperti ini:

import mymodule

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

di mana hook()apa yang disebut oleh ArcMap dan mymodulemerupakan modul yang Anda edit di antara doa. Anda mungkin harus mengedit sys.pathuntuk memasukkan jalur modul yang Anda edit agar import mymoduletidak gagal. Atau sertakan direktori dalam site-packages(mungkin menggunakan python setup.py develop).

cwa
sumber
1
Tentu saja ini hanya akan membantu selama pengembangan; Saya percaya para desainer ArcGIS ingin Anda menguji skrip Anda sebelum membangun addin ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
Ini yang saya lakukan juga. Saya juga menggunakan winpdb untuk debugging tertanam.
blah238
Terima kasih untuk sarannya. Ini sedikit di luar keahlian saya. Apakah sulit diimplementasikan? Apakah ada informasi lebih lanjut tentang ini yang dapat saya gunakan untuk belajar?
Mike
1
Saya seorang pengembang python dengan pengalaman ArcGIS terbatas, tapi saya sedang mempelajarinya. Saya akan memperbarui dengan lebih detail setelah saya mengetahuinya.
cwa
@ blah238 bagaimana Anda mengonfigurasi debugging tertanam? Addin saya akan terhubung tetapi menjatuhkan koneksi setelah dimuat.
ShaunLangley
8

Saran per @ blah238, skrip berikut

  1. menutup ArcMap (jika terbuka)
  2. menciptakan Add-in
  3. menginstal Add-in secara diam-diam
  4. membuka kembali dokumen ArcMap

Simpan ke direktori yang mengandung 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)
Paul
sumber
Apakah ini termasuk dalam file PythonTool_addin.py Anda?
ShaunLangley
@ShaunLangley, tidak, ini adalah file .py terpisah yang berada di direktori makeaddin.py
Paul
Script yang bagus. Namun, seperti yang diharapkan, ArcMap jatuh ketika skrip mencoba untuk membuka file .mxd di luar ArcMap. Apakah ada perbaikan yang diketahui untuk ini?
TheLastGIS
1
@TheLastGIS Ya. Tambahkan variabel arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"dan Map = '"{0}" {1} /s'.format(arcmap, mapdoc)ke atas. Maka os.system(Map)akan berhasil di mana os.system(mapdoc)tidak.
alphabetasoup
2

Saya menerima jawaban di situs web ArcGIS. Ternyata ini adalah satu-satunya cara untuk mengkompilasi ulang python addins Seseorang telah memasukkan ide pada Ide ArcGIS dan saya telah memilih dan berkomentar juga.

Thread Forum Diskusi ArcGIS ada di sini .

Mike
sumber
1
Bisakah Anda menambahkan tautan yang relevan ke jawaban Anda?
blah238
Saya ingin memilih tetapi tidak dapat menemukan Ide ArcGIS yang @Mike sebutkan.
PolyGeo
Maaf, saya tidak melihat balasan ini sampai sekarang. Terima kasih @PyGeo untuk memperbarui tautan ke situs web ArcGIS.
Mike
1

Saya biasanya menggunakan dua pendekatan: satu adalah, untuk alat yang Anda gunakan yang benar-benar hanya geoprocessing, memungkinkan mereka untuk diimpor, dan kemudian Anda dapat mengatur sesi Python interaktif, dan melakukan reload(mymodule)seperti yang disebutkan untuk memasukkan perubahan terbaru (atau mengatur autoreload dalam IPython ). Jika Anda hanya melakukan perubahan pada kotak alat Python, Anda dapat memuat ulang kotak alat dengan mengklik kanan di dalam tampilan Katalog dan mengklik 'Refresh'.

Untuk kode yang memang memerlukan interaksi pengguna di GUI, saya menggunakan skrip batch berikut untuk mempercepat proses:

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

Di mana myaddin.mxd memiliki lapisan data dan konteks yang saya gunakan untuk proyek tertentu. Ini akan memadamkan addin install dan ArcMap secara bersamaan, tetapi saya biasanya dapat mengklik tombol 'Install Add-in' lebih cepat daripada ArcGIS dimulai. Atau, Anda bisa menambahkan pausesebelum perintah terakhir untuk menunggu input sebelum memulai ArcGIS.

scw
sumber
1
Anda bisa menggunakan ESRIRegAddIn.exedengan /ssaklar untuk menginstal add-in yang diam-diam. Jalan menuju ESRIRegAddIn di komputer saya adalah C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238