Saya telah memposting pertanyaan minggu lalu tentang mengkustomisasi kelas ToolValidator dan mendapat beberapa jawaban yang sangat bagus. Dalam bekerja dengan solusi yang diusulkan, saya telah membuat modul khusus yang melakukan query pada db, dan akan dipanggil oleh kelas ToolValidator (untuk memberikan nilai untuk daftar drop-down) dan kemudian dalam skrip geoproses (untuk mendapatkan lainnya parameter berdasarkan item yang dipilih dalam daftar drop-down). Namun, sepertinya saya tidak dapat benar-benar memanggil modul khusus di kelas ToolValidator. Saya telah mencoba untuk menambahkan jalan tanpa hasil. Ketika saya mencoba menerapkan perubahan ini pada skrip, saya mendapatkan kesalahan runtime: [Errno 9] deskriptor file buruk. Jika saya mengomentari jalur impor, tidak ada kesalahan.
sys.path.append('my_custom_module_directory')
import my_custom_module
Banyak dari Anda mungkin bertanya mengapa saya tidak mengimplementasikan alat khusus dengan ArcObjects. Alasannya adalah bahwa pengguna akhir saya tidak memiliki hak istimewa yang diperlukan untuk mendaftarkan dll dll di komputer mereka.
UPDATE: Ini terjadi pada saya di ArcGIS 10. Cukup menarik, saya awalnya menambahkan ke jalur di dalam fungsi initialiazeParameters dari kelas ToolValidator. Jika saya menambahkan di luar (yaitu, di atas) dari kelas ToolValidator, semuanya berfungsi seperti yang diharapkan.
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
UPDATE 2: Saya pikir saya menemukan penyebab sebenarnya dari masalah saya. Dalam cuplikan kode dalam posting ini, saya telah menambahkan apa yang tampak sebagai jalur nyata (mis. C: / Working / SomeFolder) ke sys.path. Di kelas ToolValidator saya yang sebenarnya, saya membuat jalur relatif menggunakan os.path.dirname(__file__)
+ "\ my_special_folder ...". Saya mengantisipasi itu os.path.dirname(__file__)
akan mengembalikan jalur toolbox, karena itu berisi kelas ToolValidator. Saya datang untuk menemukan ini bukan masalahnya. Sejauh yang saya tahu, kelas ToolValidator tidak pernah benar-benar ditulis ke file .py, dan saya berspekulasi bahwa kode ini diteruskan ke juru bahasa python dalam memori, jadi __file__
tidak berguna, atau skrip temp tetap ada dan kemudian execfile ( path_to_script) dipanggil, lagi rendering__file__
tak berguna. Saya yakin ada alasan lain saya juga hilang.
Singkatnya, jika saya menggunakan jalur hardcoded, sys.append berfungsi di mana saja, jalur relatif tidak bekerja dengan baik di kelas ToolValidator.