รวบรวม Python Addin อีกครั้งหลังจากแก้ไขสคริปต์หรือไม่


15

ฉันได้พัฒนา python addins สองสามตัวและฉันก็แค่สงสัยว่าอะไรคือวิธีที่ดีที่สุดในการรวบรวม Addin ใหม่ทุกครั้งที่ฉันแก้ไขสคริปต์

ปัจจุบันถ้าฉันแก้ไขสคริปต์ดูเหมือนว่าฉันต้องทำ

  1. ปิด ArcMap
  2. ไปที่โฟลเดอร์ Addin ของฉันแล้วดับเบิลคลิกไฟล์หลาม 'makeaddin'
  3. ดับเบิลคลิกที่ไฟล์ 'Python Addin
  4. รีสตาร์ท ArcMap เพื่อให้การเปลี่ยนแปลงมีผล

หากฉันไม่ทำตามขั้นตอนเหล่านี้การแก้ไขจะไม่ได้รับการยอมรับ สิ่งนี้น่ารำคาญและใช้เวลานานเมื่อฉันต้องการวางสายการพิมพ์ง่ายๆที่ไหนสักแห่งหรือฉันจะทำการแก้ไขเพียงเล็กน้อยเพื่อทดสอบผลลัพธ์

มีวิธีที่ดีกว่าในการทำเช่นนี้?

คำตอบ:


11

คุณสามารถใช้reloadฟังก์ชันbuiltin ใน python เพื่อโหลดโมดูลของคุณใหม่โดยอัตโนมัติ สิ่งที่คุณสามารถทำได้คือสิ่งนี้:

import mymodule

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

ที่hook()ใดที่เรียกว่าโดย ArcMap และmymoduleเป็นโมดูลที่คุณกำลังแก้ไขระหว่างการเรียกใช้ คุณอาจต้องแก้ไขsys.pathเพื่อรวมเส้นทางของโมดูลที่คุณกำลังแก้ไขเพื่อที่import mymoduleจะไม่ล้มเหลว หรือรวมไดเรกทอรีในsite-packages(อาจจะใช้python setup.py develop)


1
แน่นอนว่าสิ่งนี้จะเป็นประโยชน์ในระหว่างการพัฒนาเท่านั้น ฉันเชื่อว่านักออกแบบ ArcGIS ตั้งใจให้คุณทดสอบสคริปต์ของคุณก่อนสร้าง addin ( resources.arcgis.com/th/help/main/10.1/index.html#/… )
cwa

นี่คือสิ่งที่ฉันทำเช่นกัน ฉันยังใช้winpdbสำหรับการดีบักแบบฝัง
blah238

ขอบคุณสำหรับคำแนะนำ นี่เป็นสิ่งที่เกินความสามารถของฉันเล็กน้อย มันยากที่จะใช้หรือไม่ มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้อีกไหมที่ฉันสามารถใช้เพื่อเรียนรู้?
Mike

1
ฉันเป็นนักพัฒนาหลามที่มีประสบการณ์ ArcGIS ที่ จำกัด แต่ฉันเรียนรู้มัน ฉันจะอัปเดตพร้อมรายละเอียดเพิ่มเติมหลังจากที่ฉันทราบแล้ว
cwa

@ blah238 คุณกำหนดค่าการดีบักแบบฝังได้อย่างไร Addin ของฉันจะเชื่อมต่อ แต่จะตัดการเชื่อมต่อหลังจากโหลดแล้ว
ShaunLangley

8

ตามคำแนะนำของ @ blah238 สคริปต์ต่อไปนี้

  1. ปิด ArcMap (ถ้าเปิด)
  2. สร้าง Add-in
  3. ติดตั้ง Add-in อย่างเงียบ ๆ
  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
Paul

สุดยอดสคริปต์ อย่างไรก็ตามตามที่คาดไว้ ArcMap จะหยุดทำงานเมื่อสคริปต์พยายามเปิดไฟล์. xmd นอก 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 เห็นได้ชัดว่านี่เป็นวิธีเดียวที่จะรวบรวมไพ ธ อนคอมไพล์ได้อีกครั้ง มีคนบันทึกความคิดเกี่ยวกับแนวคิด ArcGISและฉันลงคะแนนและแสดงความคิดเห็นด้วย

ArcGIS ฟอรั่มด้ายตั้งอยู่ที่นี่


1
คุณสามารถเพิ่มลิงค์ที่เกี่ยวข้องกับคำตอบของคุณได้หรือไม่?
blah238

ฉันต้องการลงคะแนน แต่ไม่สามารถหาแนวคิด ArcGIS ที่ @Mike กล่าวถึง
PolyGeo

ขออภัยฉันไม่เห็นคำตอบนี้จนกระทั่งตอนนี้ ขอบคุณ @PolyGeo สำหรับการอัพเดทลิงค์ไปยังเว็บไซต์ ArcGIS
Mike

1

โดยทั่วไปฉันใช้สองวิธี: วิธีหนึ่งคือสำหรับเครื่องมือใด ๆ ที่คุณใช้ซึ่งเป็นเพียงการประมวลผลทางภูมิศาสตร์อนุญาตให้นำเข้าและจากนั้นคุณสามารถตั้งค่าเซสชัน Python แบบโต้ตอบและทำreload(mymodule)ตามที่กล่าวถึงเพื่อรวมการเปลี่ยนแปลงล่าสุด (หรือตั้งค่าโหลดอัตโนมัติใน IPython ) หากคุณเพิ่งเปลี่ยนแปลงกล่องเครื่องมือ Python คุณสามารถโหลดกล่องเครื่องมือใหม่ได้โดยคลิกขวาในมุมมองแคตตาล็อกและคลิก 'รีเฟรช'

สำหรับรหัสที่ต้องการการโต้ตอบกับผู้ใช้ใน GUI ฉันจะใช้สคริปต์ชุดต่อไปนี้เพื่อเร่งกระบวนการ:

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

ที่ myaddin.mxd มีชั้นข้อมูลและบริบทที่ฉันใช้สำหรับโครงการเฉพาะ สิ่งนี้จะทำให้การติดตั้ง Addin และ ArcMap พร้อมกัน แต่โดยปกติฉันสามารถคลิกที่ปุ่ม 'ติดตั้ง Add-in' ได้เร็วกว่าที่ ArcGIS เริ่มทำงาน หรือคุณสามารถเพิ่มpauseก่อนคำสั่งสุดท้ายเพื่อรออินพุตก่อนเริ่ม ArcGIS


1
คุณสามารถใช้ESRIRegAddIn.exeกับ /sสวิตช์เพื่อติดตั้ง Add-in แบบเงียบ ๆ เส้นทางไปยัง ESRIRegAddIn C:\Program Files (x86)\Common Files\ArcGIS\binในเครื่องของฉันคือ
blah238
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.