我已经发布了一个问题,上周有关自定义ToolValidator类,并得到了一些很好的答案。在使用建议的解决方案时,我创建了一个自定义模块,该模块在db上执行查询,并且将由ToolValidator类(为下拉列表提供值)以及稍后在地理处理脚本(以获取其他信息)中调用参数(基于下拉列表中选择的项目)。但是,我似乎无法实际调用ToolValidator类中的自定义模块。我一直在尝试追加到没有运气的路径。当我尝试将这些更改应用于脚本时,出现运行时错误:[Errno 9]错误的文件描述符。如果我注释掉导入行,则没有错误。
sys.path.append('my_custom_module_directory')
import my_custom_module
你们中的许多人可能会问为什么我不只是使用ArcObjects实现自定义工具。原因是我的最终用户没有在计算机上注册任何dll所必需的特权。
更新:这是在ArcGIS 10中发生的。很有趣的是,我最初是附加到ToolValidator类的initialiazeParameters函数内部的路径。如果我在ToolValidator类的外部(即,在其顶部)进行附加操作,则一切都会按预期进行。
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()
更新2: 我认为我找到了造成问题的真正原因。在本文的代码段中,我一直在将看起来真实的路径(例如C:/ Working / SomeFolder)附加到sys.path中。在我实际的ToolValidator类中,我正在使用os.path.dirname(__file__)
+“ \ my_special_folder ...” 构造相对路径。我预计os.path.dirname(__file__)
它将返回工具箱的路径,因为其中包含ToolValidator类。我来发现并非如此。据我所知,ToolValidator类实际上从未写入过.py文件,并且我推测此代码将传递给内存中的python解释器,因此__file__
是没有用的,或者持久保存了一些临时脚本,然后执行文件( path_to_script)被调用,再次渲染__file__
无用。我确定还有其他原因也很想念。
长话短说,如果我使用硬编码路径,则sys.append可以在任何地方使用,相对路径在ToolValidator类中不能很好地工作。