Geçen hafta bir ToolValidator sınıfını özelleştirme hakkında bir soru yayınlamıştım ve çok iyi cevaplar aldım. Önerilen çözümlerle çalışırken, bir db üzerinde sorgular gerçekleştiren özel bir modül oluşturdum ve hem ToolValidator sınıfı (açılır listeler için değer sağlamak için) hem de daha sonra coğrafi işlem komut dosyasında (diğerlerini almak için) çağrılacak parametreleri açılır listelerde seçilen öğelere göre). Ancak, aslında ToolValidator sınıfındaki özel modülü çağırmak gibi görünmüyor. Ben şanssız bir yola eklemek için çalışıyorum. Bu değişiklikleri komut dosyasına uygulamaya çalıştığımda, bir çalışma zamanı hatası alıyorum: [Errno 9] Bozuk dosya tanıtıcı. İçe aktarma satırını yorumlarsam hata olmaz.
sys.path.append('my_custom_module_directory')
import my_custom_module
Birçoğunuz neden sadece ArcObjects ile özel bir araç kullanmıyorum diye soruyor olabilirsiniz. Nedeni, benim son kullanıcıların bilgisayarlarında HERHANGİ dlls kayıt için gerekli ayrıcalıklara sahip olmamasıdır.
GÜNCELLEME: Bu bana ArcGIS 10'da oluyordu. İlginçtir ki, başlangıçta ToolValidator sınıfının initialiazeParameters işlevinin içindeki yola ekliyordum. Eğer eklentiyi ToolValidator sınıfının dışında (yani üstünde) yaparsam, her şey beklendiği gibi çalışır.
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()
GÜNCELLEME 2: Sanırım problemimin gerçek nedenini buldum. Bu yazıdaki kod parçacıklarında, gerçek yollar gibi görünen (ex C: / Working / SomeFolder) sys.path'e ekliyorum. Gerçek ToolValidator sınıfımda, os.path.dirname(__file__)
+ "\ my_special_folder ..." kullanarak göreceli bir yol oluşturuyordum . os.path.dirname(__file__)
ToolValidator sınıfını içerdiğinden, bu, araç kutusunun yolunu döndüreceğini tahmin ediyordum . Ben bunun böyle olmadığını bulmaya geldim. Anlayabildiğim kadarıyla, ToolValidator sınıfı hiçbir zaman aslında bir .py dosyasına yazılmıyor ve bu kodun bellekte python yorumlayıcısına iletildiğini tahmin ediyorum, bu yüzden __file__
işe yaramaz veya geçici bir komut dosyası kalıcı ve sonra yürütülür ( path_to_script) çağrılır, tekrar oluşturulur__file__
Faydasız. Eminim ki kaçırmamın başka nedenleri de vardır.
Uzun lafın kısası, eğer sabit kodlanmış bir yol kullanırsam, sys.append her yerde çalışır, göreli yollar ToolValidator sınıfında çok iyi çalışmaz.