ArcGIS Python Toolbox'ta içe aktarılan modüller yenileniyor mu?


15

ArcMap'te bir python araç kutusu (.pyt) kullanırken, genellikle .pyt dosyasının giriş argümanlarını toplamak ve araçları tanımlamak için yalnızca bir sarıcı olduğu bir deseni izlerim. Destek kodu ayrı birim test edilebilir modüllerde tutulur.

Misal:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

Bu gerçekten iyi çalışıyor ama geliştirme sırasında sinir bozucu bir sorunla karşılaştım. ArcMap'te .pyt'de sağ tıklayın -> Yenile yalnızca .pyt dosyasının kodunu yeniler. İçe aktarılan modülleri yenilemez, bu yüzden orada bir şey değiştirdiğimde ArcMap'i kapatıp tekrar açmam gerekir. Neyse ki, kodu bağımsız olarak test ettiğim için, bunu bir ton yapmak zorunda değilim, ama yine de büyük bir güçlük. Bunun etrafında bir yol var mı? Biraz ilgili - Python konsolunu tamamen yenilemenin herhangi bir yolu var mı (ayrıca, değişiklikleri de almak için ArcMap'ı kapatmam / yeniden açmam gereken özel bir site paketim var)?

ArcMap 10.2.1 kullanıyorum.

Yanıtlar:


14

Bu olasılığı buldum, /programming/1517038/python-refresh-reload

Bir uyarı, modüle atanmış herhangi bir değişkeniniz varsa, bunların yeniden atanması gerektiğidir.

Ancak yukarıda yazdığınız gibi, bunu yapabilirsiniz:

import supporting_module
def execute()
  reload(supporting_module)
  ...

Bu şekilde, aracı her çalıştırdığınızda güncellenmiş modüle sahip olduğunuzdan emin olursunuz. Geliştirme tamamlandığında, bu çıkarılabilir.


1
Son derece yardımsever ve bu, gönderdiğim basit örneği çözüyor. Ancak, support_module diğer yardımcı modülleri de içeri aktarıyorsa, yeniden yükleme ile de çağrılmaları gerekir. Bence bu, Python'un modülleri yükleme biçimiyle mantıklı olacağımız en iyi şey olduğunu düşünüyorum - ertesi gün daha sağlam bir şey gelmezse sizinkinin cevabı olarak işaretleyeceğim.
Josh Werts

Çok yararlı. reload()Araç kutusunun PYT dosyasının en üstünde, destekleyici modülü içe aktardıktan hemen sonra aramanın yeterli olduğunu buldum . Bu nedenle, araç kutusu birkaç araç içeriyorsa, her aracın execute()işlevinde yeniden yüklemeyi çoğaltmam gerekmez .
Mike Finch

Bu anwser'ın sorunu nasıl çözdüğünü gerçekten anlamıyorum. Ben benim Araçlar .py dosyalarında saklanan ve bunları kullanarak içe from pyfile import Toolekleyerek reload(tool)döner typeError: reload() argument must be module. Herhangi bir fikir?
Ratnanil

2
Çözümü buldum! py-File'ı önce bir Modül olarak içe aktarın, sınıfı yeniden yükleyin ve ardından modülü modülün içine aktarın. Bakınız: stackoverflow.com/a/6946467/4139249
Ratnanil

5

İşte daha önce önerdiğimden farklı ve daha sağlam bir yol.

Bu modülü kendim kullanmadım, ancak sorununuzu çözeceğini düşünüyorum:

Python Modülü Yeniden Yükleme Aracı

Bu kütüphane, Python için bağımlılık tabanlı bir modül yeniden yükleyici uygular. Yerleşik reload () işlevinin aksine, bu yeniden yükleyici istenen modülü ve bu modüle bağımlı diğer tüm modülleri yeniden yükler.

Önceki örnek göz önüne alındığında, bu tüm bağımlılıkları tek bir çağrı ile yüklemelidir:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

Bu modülü ilk kez fark ettim, bu yüzden onu araçlarınıza uygularsanız, sizin için ne kadar iyi çalıştığını yorumlayın.


İyi bulmak! Bu, tam olarak gösterdiğiniz gibi eklenirse işe yaradı. Yalnızca .pyt dosyasının kendisi değişirse araç kutusunda sağ tıklatmak -> yenilemek zorundayım. Destek modülleri ve alt modülleri başarıyla yeniden yüklenmektedir. Bir uyarı olsa da - vesilesiyle bir kaç açıklanamayan istisna ve bir ArcMap kazası aldım (ArcMap çöküyor ne yazık ki gerçekten anormal değil olsa da). Not - Bunu sadece destek modülü ve bir bağımlı alt modül ile test ettim. İleride istikrar hakkında rapor verebilir.
Josh Werts

1
Süper, geri bildiriminiz için teşekkürler. Evet, ArcMap kullanırken, bazen bir Çarpışma Testi Kukla gibi hissediyorum.
cndnflyr

Ne yazık ki, bu yeniden yükleyici ile çok fazla kararlılık sorunu ile karşılaştım, bu yüzden orijinal reload () yerleşik işlevine seçilen cevabı değiştirdim. Bazen daha basit daha iyidir!
Josh Werts
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.