Menyegarkan modul yang diimpor di ArcGIS Python Toolbox?

15

Saat menggunakan kotak alat python (.pyt) di ArcMap, saya biasanya akan mengikuti pola di mana file .pyt itu sendiri hanyalah pembungkus untuk mengumpulkan argumen input dan mendefinisikan alat itu sendiri. Kode pendukung disimpan dalam modul unit-testable yang terpisah.

Contoh:

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)

Ini bekerja dengan sangat baik tetapi saya telah mengalami satu masalah yang membuat frustrasi selama pengembangan. Klik kanan -> Refresh pada .pyt di ArcMap hanya menyegarkan kode file .pyt. Itu tidak menyegarkan modul yang diimpor, jadi saya harus menutup dan membuka kembali ArcMap setiap kali saya mengubah sesuatu di sana. Untungnya, karena saya sedang menguji kodenya secara independen, saya tidak perlu melakukan ini banyak, tetapi masih merupakan masalah besar. Apakah ada cara untuk mengatasi ini? Agak terkait - apakah ada cara untuk me-refresh sepenuhnya konsol Python (saya punya paket-situs kustom yang saya juga harus menutup / membuka kembali ArcMap untuk menarik perubahan juga)?

Saya menggunakan ArcMap 10.2.1.

Josh Werts
sumber

Jawaban:

14

Saya menemukan kemungkinan ini, /programming/1517038/python-refresh-reload

Satu peringatan adalah bahwa jika Anda memiliki variabel yang ditugaskan ke modul, mereka perlu ditugaskan lagi.

Tetapi seperti yang Anda tulis di atas, Anda dapat melakukan ini:

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

Dengan cara ini setiap kali Anda menjalankan alat Anda pasti akan memiliki modul yang diperbarui. Setelah pengembangan dilakukan, ini bisa diambil.

cndnflyr
sumber
1
Sangat membantu dan ini memecahkan contoh sederhana yang saya posting. Namun, jika mendukung_module juga mengimpor modul helper lainnya, maka mereka perlu dipanggil dengan reload juga. Saya pikir ini adalah yang terbaik yang akan kami dapatkan karena masuk akal dengan cara Python memuat modul - saya akan menandai jawaban Anda jika sesuatu yang lebih kuat tidak muncul di hari berikutnya.
Josh Werts
Sangat membantu. Saya telah menemukan bahwa itu cukup untuk menelepon reload()langsung setelah mengimpor modul pendukung, di bagian atas file PYT toolbox. Jadi, jika kotak alat berisi beberapa alat, saya tidak harus menduplikasi ulang di execute()fungsi masing-masing alat .
Mike Finch
Saya tidak begitu mengerti bagaimana anwser ini memecahkan masalah. Saya memiliki Alat saya disimpan dalam file .py dan saya mengimpornya menggunakan from pyfile import Tool, menambahkan reload(tool)kembali typeError: reload() argument must be module. Ada ide?
Ratnanil
2
Saya menemukan solusinya! impor file-py sebagai Modul terlebih dahulu, muat ulang dan impor kelas di dalam modul. Lihat: stackoverflow.com/a/6946467/4139249
Ratnanil
5

Inilah cara yang berbeda dan lebih kuat dari yang saya sarankan sebelumnya.

Saya belum pernah menggunakan modul ini, tapi saya pikir itu akan menyelesaikan masalah Anda:

Modul Reloader Python

Pustaka ini mengimplementasikan reloader modul berbasis dependensi untuk Python. Tidak seperti fungsi builtin reload (), reloader ini akan memuat kembali modul yang diminta dan semua modul lain yang bergantung pada modul itu.

Dengan contoh sebelumnya, ini akan memuat semua ketergantungan dengan satu panggilan:

import reloader
reloader.enable()

import supporting_module

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

Ini adalah pertama kalinya saya memperhatikan modul ini, jadi jika Anda mengimplementasikannya di alat Anda, komentar kembali pada seberapa baik kerjanya untuk Anda.

cndnflyr
sumber
Bagus temukan! Ini berfungsi jika ditambahkan persis seperti yang Anda tunjukkan. Saya hanya perlu mengklik kanan -> menyegarkan pada kotak alat jika file .pyt itu sendiri berubah. Modul pendukung dan sub modulnya sedang dimuat ulang dengan sukses. Satu peringatan - saya memang mendapatkan beberapa pengecualian yang tidak dapat dijelaskan pada kesempatan dan crash ArcMap (meskipun ArcMap crash sebenarnya tidak begitu abnormal, sayangnya). Catatan - Saya hanya menguji ini dengan modul pendukung dan satu sub-modul dependen. Dapat melaporkan kembali stabilitas di masa depan.
Josh Werts
1
Super, terima kasih telah melaporkan kembali. Ya, saat mengendarai ArcMap, saya terkadang merasa seperti Crash Test Dummy.
cndnflyr
Sayangnya, saya mengalami terlalu banyak masalah stabilitas dengan reloader ini, jadi saya telah mengubah jawaban yang dipilih ke fungsi bawaan reload () bawaan. Terkadang lebih sederhana lebih baik!
Josh Werts