Pola pengkodean yang umum digunakan dalam AML adalah menjalankan AML (dengan parameter) di dalam AML lain.
Aplikasi yang saat ini saya kembangkan akan mendapat manfaat karena dapat menjalankan skrip Python (dengan parameter) dalam skrip Python lain.
Namun, ini tampaknya tidak langsung sama sekali.
Menggunakan ArcGIS 10, saya bereksperimen dengan membungkus skrip Python "dalam" ke dalam alat ArcGIS yang memiliki parameter. Saya pikir ini akan menjadi masalah sederhana untuk memiliki skrip Python "luar" menggunakan arcpy.ImportToolbox untuk mengimpor kotak alat dan kemudian menjalankan alat di dalamnya. Namun, dalam pengujian sejauh ini semua upaya saya untuk menjalankan alat "dalam" dari skrip "luar" tampaknya hanya melewatkan alat "dalam" (tidak ada kesalahan dilemparkan).
Berikut adalah beberapa kode uji untuk mencoba dan menggambarkan dengan lebih baik apa yang saya coba gambarkan.
Skrip testinner.py saya adalah:
inputString = arcpy.GetParameterAsText(0)
newFC = "C:\\Temp\\test.gdb\\" + inputString
arcpy.Copy_management("C:\\Temp\\test.gdb\\test",newFC)
Skrip testouter.py saya adalah:
import arcpy
inputString1 = arcpy.GetParameterAsText(0)
inputString2 = arcpy.GetParameterAsText(1)
arcpy.ImportToolbox("C:\\Temp\\test.tbx")
arcpy.testinner_test(inputString1)
arcpy.testinner_test(inputString2)
Untuk testinner.py alatnya membutuhkan parameter String tunggal.
Untuk testouter.py alatnya membutuhkan dua parameter String
Dua alat ditempatkan di test.tbx.
Test.gdb hanya membutuhkan satu kelas fitur kosong bernama test.
Setelah Anda memiliki yang dirakit di atas, menjalankan alat testinner dengan string seperti 'abc' dilewatkan sebagai parameternya akan menghasilkan 'tes' kelas fitur yang disalin ke yang disebut 'abc' OK.
Tetapi ketika Anda mencoba menjalankan alat testouter dengan dua string seperti 'uvw' dan 'xyz' sebagai parameternya, alat testinner dalam testouter.py tampaknya berjalan OK sekali, tetapi mengirimkan ArcMap 10 SP2 pada Vista SP2 ke Serious Application Error saat mencoba menggunakannya kedua kalinya.
Pengujian yang sama menggunakan Windows XP SP3 dan ArcGIS Desktop 10 SP2 juga menghasilkan Kesalahan Aplikasi Serius pada titik yang sama.
Jawaban:
Berikut ini contoh pengujian Anda yang dimodifikasi untuk mengimpor modul "utilitas" dalam skrip utama dan memanggil fungsi menggunakan parameter yang dibaca oleh alat skrip:
CopyFeaturesTool.py - Alat skrip yang membaca dalam parameter dan memanggil fungsi dalam modul lain
CopyFeaturesUtility.py - Modul yang memiliki fungsi tunggal
copyFeaturesToTempGDB
. Dapat diimpor atau dijalankan mandiri. Jika dijalankan mandiri, kode di bawahif __name__ == '__main__'
dijalankan.Saya pikir Anda akan menemukan pendekatan modular ini menjadi jauh lebih efisien dan logis setelah Anda terbiasa. Bagian Modul dalam tutorial Python standar juga merupakan sumber yang bagus untuk memahami cara kerja impor.
Untuk contoh yang lebih spesifik tentang busur, lihat skrip bawaan di
C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts
folder Anda .sumber
Anda dapat melakukannya dengan mengimpor modul (skrip yaitu) ke skrip utama Anda dan memanggil fungsinya. Demo sederhana terkandung dalam dua skrip yang menyertai.
untuk program utama dan untuk fungsi-fungsi yang dipanggil
Anda hanya perlu memastikan bahwa modul utama dan modul anak ada di folder yang sama. Anda dapat mengirimkan parameter ke modul anak dengan mudah dan jika modul anak membutuhkan akses ke arcpy (dengan asumsi Anda menggunakan arcmap versi 10) cukup berikan referensi padanya.
sumber
Mengimpor dan menjalankan fungsi adalah cara yang lebih bersih untuk melakukannya, tetapi demi kelengkapan, ada juga
execfile
fungsi bawaan ( dokumentasi ) yang akan memungkinkan Anda menjalankan file sewenang-wenang dalam konteks saat ini.sumber
The Metode execfile dijelaskan oleh @JasonScheirer memungkinkan saya untuk mengatur ulang kode saya dengan yang di bawah ini dan memberikan solusi untuk masalah pengujian saya:
Namun, ini mungkin terbukti rumit ketika diterapkan pada skrip non-tes yang jauh lebih lama sehingga saya menggunakan karya @ blah238 yang mendukung pendekatan @ DanPatterson dan menghasilkan kode akhir (pengujian) berikut yang melakukan persis apa yang saya butuhkan.
dan
sumber