赞
踩
通常,如果要与其他人分享脚本工具或者python工具箱,最好避免使用硬编码路径。相反,路径是从工具对话框的参数上导出,这些路径传递给脚本,脚本使用GetParameterAsText()
和GetParameter()
函数读取参数。
但是有时候必须使用一个硬编码去定位一个文件。例如:需要使用现有的layer文件设置输出样式或者工具可能需要使用查找表时。根据信息的性质,这个编码可能被合并到脚本中,例如查找表被编码为python字典,但是这并不总是可能的。因此,一些文件对工具运行时必须的,即使他们没有作为参数提供给用户指定。相反,这些文件由脚本的作者提供,并作为共享工具的一部分。按前面介绍的文件夹结构,这些文件可以放在Data文件夹中,这样就可以相对于脚本的位置找到数据文件。如果使用特定的符号系统,也可以将相关的lay文件存储到layer文件夹中。文件不是必须使用特定的路径,但是必须是能让脚本定位所需要的文件。
也可使用代码找到脚本路径:
scriptpath=sys.path[0]
或者
scriptpath=os.getcwd()
运行这个代码会生成一个字符串,其中包含脚本的完整路径,但不包含脚本本身的名称,如果脚本运行所需的文件位于Data文件夹中,则需要根据建议的文件夹结构,python模块中的os.path能用于创建数据的路径。
前面使用的文件夹结构可以作为示例:工具文件夹中包含工具,包括根文件夹中的工具箱、Scripts文件夹中的脚本和Data文件夹中的数据文件。脚本工具使用了相对路径,因此可以移动Tools文件夹,或者重命名这个文件夹,脚本仍然能工作。为了运行,脚本需要一个名为”lookup“的数据库表,位于被叫做TestData.gdb的文件地理数据库中。表和地理数据库的名称可以硬编码到脚本中,因为脚本的作者也是表的作者和Data文件夹的创建者。但是,绝对路径不应硬编码到脚本中,而是使用相对路径:Data\TestData.gdb\lookup。这将使Tools文件夹可以移动到任何的位置,而脚本工具的用户不限于脚本作者最初使用的绝对路径。
在脚本中引用查找表的代码如下所示:
import arcpy
import os
scriptpath = os.getcwd()
toolpath = os.path.dirname(scriptpath)
tooldatapath = os.path.join(toolpath, "Data")
datapath = os.path.join(tooldatapath, "TestData.gdb/lookup")
脚本中硬编码了三个元素:地理数据库表的文件名称、文件地理数据库和数据所在的文件夹。这些元素由工具的作者创建,因此可以硬编码到脚本中,不依赖于用户的输入。
一些工具肯恩给需要使用临时工作空间(scratch workspace)去编写中间数据。虽然可以在脚本中设置一个特定的临时工作空间, 但是这样不可靠,因为脚本工具不应该包含自己的地理数据库去编写结果。一个稳定的设计是去使用临时GDB环境设置,这个设置指向文件地理数据库的位置。使用arcpy.env
类中的scratchGDB
属性去指向位置。这个属性是只读的,这个环境设置的主要目的是在脚本和模型中使用。临时GDB是可靠的,也因为在运行脚本工具时,地理数据库是保证存在的,用户可以在ArcGIS Pro中指定临时工作空间,没有制定新的话就默认为当前用户的文件夹。
可以用代码获取临时GDB的位置:
import arcpy
print(arcpy.env.scratchGDB)
结果一般如下所示:
C:\Users\<username>\AppData\Local\Temp\scratch.gdb
python窗口中一样的代码将显示与当前项目关联的默认临时GDB;
C:\Users\<username>\AppData\Local\Temp\ArcGISProTemp………
\scratch.gdb
无论位置在哪,这个文件地理数据库都存在。这个数据库的名称和位置不应该在脚本中硬编码,而是使用arcpy.env.scratchGDB
获得。输出结果写入到临时GDB使脚本可以被移动,因为不需要验证是否临时GDB存在。
另一种常用的硬编码场景使使用lay文件到输出样式中。结合本章Terrain工具的文件夹结构:
原本的工具包含14个脚本工具和几十个图层文件,但是这里仅仅显示了一个脚本工具和一个图层文件。脚本IllumContours.py位于Scripts文件夹中,而脚本引用的图层文件为例LayerFiles文件夹中。在脚本中,对于图层文件的引用设置如下:
# set the symbology
scriptPath = sys.path[0]
one_folder_up = os.path.dirname(scriptPath)
toolLayerPath = os.path.join(one_folder_up, "LayerFiles")
lyrFile = os.path.join(toolLayerPath, "Illuminated
Contours.lyr")
图层文件时脚本共使用硬编码文件夹和文件的常见原因之一。如果脚本工具作者考虑了使用相对路径,并且脚本工具的用户不更改文件夹结构和文件夹及文件的名称,那么就会正常工作。
python工具箱也和脚本工具一样,可以使用一样的方法设置图层文件的引用、查找表等。
共享脚本和python工具箱,用户都可以打开脚本,查看脚本中的代码。脚本也可以被嵌入到自定义的工具箱中。代码包含在工具箱中,不再需要一个单独的脚本文件。这种方式可以使管理和共享工具更容易。
导入要嵌入的脚本,可以右键脚本工具,单机属性。在工具属性对话框,General选项卡,找到面板下部的”Options“部门,选中 Import script选项,.py文件将会被嵌入到工具箱中。
一旦脚本被导入到工具中,就可以共享工具箱,但是不共享脚本。也就是仅仅共享.tbx文件,不共享py文件。但是,当导入脚本时,原始脚本文件不会被删除,只是被复制并且嵌入到了工具箱中。
嵌入脚本并不意味着脚本不能再被查看或编辑。例如,假设导入了一个脚本并与另一个用户共享了一个工具箱,收件人可以进入工具属性并取消选中导入脚本选项以获得原始脚本的副本,收件人也可以右键单击脚本工具并单击“编辑”,然后在默认编辑器中打开一个临时脚本文件。这两个选项都可以查看和编辑脚本。虽然嵌入脚本是减少要管理和共享的文件数量的一种有用方法,但它可能会导致一些混乱。例如,一些脚本工具使用多个脚本,例如脚本工具引用的脚本和第一个 脚本调用的其他脚本。嵌入多个脚本可能会让用户感到困惑,因为脚本的工作方式变得不那么透明。
常规脚本文件不能受密码保护。如果共享包括单独.py 文件在内的工具,任何用户都可以使用Python编辑器或文本编辑器打开这些脚本。用户可以修改代码或复制代码以在自己的脚本中使用。然而,有时可能需要隐藏脚本的内容,例如登录凭据和其他敏感信息。如果您的脚本文件需要密码保护,首先可以嵌入脚本,然后选中Set password选项。
设置密码不会影响脚本工具的执行,但任何取消选中导入脚本选项的尝试都会提示使用密码。
因为Python工具箱由一个.pyt 文件组成,所以不需要嵌入单独的脚本文件来减少文件的数量。为了防止用户查看Python工具箱的内容,可以加密文件。
在ArcGIS Pro的目录窗格中,右键单击Python工具箱,然后单击加密。
单击“加密”将打开“设置密码”对话框。根据警告消息,设置密码会覆盖现有的未加密文件,因此您应该制作Python工具箱 的备份副本。因为Python工具箱由一个文件组成,所以不能像为脚本工具那样为单个工具设置密码,只能对Python工具箱进行加密。另一方面,您不能加密自定义工具箱,只能加密工具箱中的单个脚本工具。
要解密加密的Python工具箱,请右键单击Python工具箱,然后单击解密。加密和解密也可以分别使用ArcPy的EncryptPYT()
和DecryptPYT()
函数完成。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。