自定义工具箱(.atbx 和 .tbx)和 Python (.pyt) 工具箱可以作为 Python 包进行分发。 构建和分发工具箱包括创建 Python 包和使用 esri 文件夹扩展包结构以包含您自己的工具箱。 在 Python 环境中安装包后,工具箱的显示和访问方式将与 ArcGIS Pro 中系统工具箱的显示和访问方式相同,即可通过地理处理窗格和 arcpy 进行访问。 此外,针对消息分发、基于语言的帮助以及对本地化设置的响应,自定义地理处理模块可以利用 ArcGIS Pro 系统工具箱拥有的一套成熟方法。
创建 Python 包
出于说明的目的,我们将创建一个名为 foo 的 Python 包,其中包含 bar.py 模块。
bar Python 模块的示例代码。
import os
def hello():
return f'Hello {os.getenv("username")}'
要构建并分发包,必须存在特定的目录结构。 必须创建一个名为 foo 的目录,用于存储 bar 模块。 由于分发要求存储 bar 模块的目录位于父目录中,因此需要创建一个名为 src 的目录来保存 foo 目录和 bar 模块。 该目录结构将如下所示:
src
└───foo
└ bar.py
要使 bar 模块在导入后即可进行初始化并执行特定代码,其需要 __init__.py 文件。 通过使用 __init__.py 文件,Python 可将 foo 目录视为一个包。
foo 中 __init__.py 的示例代码。
from foo import bar
该目录结构现在将为如下所示:
src
└───foo
├ __init__.py
└ bar.py
注:
在整个过程中,目录中可能出现额外的 __pycache__ 文件夹。 这些文件夹是 Python 生成的已编译版本模块的缓存,用于提高模块的加载速度。 为了简化文件夹结构图,此处未显示这些目录。
通过文件和目录结构,可以通过 import foo 导入 bar 模块并执行 foo.bar.hello() 函数。
注:
要在 Python 中导入模块,模块必须位于当前目录、sys.path 中列出的目录或通过 PYTHONPATH 环境变量列出的目录。
使用地理处理工具扩展 Python 包
要使用自定义或 Python 工具箱扩展 Python 包,工具箱和随附文件应组织到 esri 文件夹中的模块中。 使用自定义地理处理功能扩展的 Python 包的标准目录结构应为如下所示:
Src
└──foo
├ __init__.py
├ bar.py
└──esri
├──arcpy
├──help
│ └──gp
│ ├──messages
│ └──toolboxes
└──toolboxes
自定义工具箱以及所有支持 .py 文件位于 esri\toolboxes 目录中。 工具箱和工具箱元数据文件 (.xml) 存储在 esri\help\gp 文件夹中。
- 工具箱元数据文件的命名约定为工具箱别名后跟 _toolbox。
- 工具元数据文件的命名约定为工具名后跟工具箱别名,使用下划线分隔。
通过创建名为 SamplePythonToolbox 的 Python 工具箱,可以演示通过 Python 包扩展地理处理的过程。
了解有关创建 Python 工具箱的详细信息用于创建 Python 工具箱的示例代码:
# -*- coding: utf-8 -*-
import arcpy
import os
import foo
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Sample Python Toolbox"
self.alias = "SamplePythonToolbox"
# List of tool classes associated with this toolbox
self.tools = [SampleTool]
class SampleTool(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Sample Tool"
self.description = ""
self.canRunInBackground = False
def getParameterInfo(self):
"""Define parameter definitions"""
parameters=[arcpy.Parameter(displayName='Msg',
name='msg',
datatype='GPString',
parameterType='Derived',
direction='Output')
]
return parameters
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
result = foo.bar.hello()
messages.AddMessage(f"{result}, welcome to the sample tool")
parameters[0].value = result
return
注:
要在这一阶段测试工具箱,请将其暂时放置在根 src 文件夹中。 由于要在工具箱中导入 foo,该工具可能无法正确运行,除非它与 foo 包位于同一目录中。
在 SamplePythonToolbox.pyt 工具箱中,foo 包已导入,且 SampleTool 类的 execute 方法已从 bar 模块中调用 hello() 函数。
此方法是将自定义 Python 代码作为包进行分发并通过 ArcGIS Pro 地理处理工具显示其功能的有效方法。 创建 SamplePythonToolbox.pyt 工具箱后,可以通过元数据为工具箱配置参数帮助。 要编辑工具的元数据,在目录窗格中右键单击工具箱中的工具,然后选择编辑元数据。
更新工具和工具箱的元数据后,可以运行 arcpy.gp.createtoolboxsupportfiles 函数以生成在上述 esri 文件夹结构内可以找到的支持 .xml 文件。 此命令还会生成 arcpy 包装器 SamplePythonToolbox.py,以该工具命名,使工具箱能够通过 arcpy 访问。 如果该处不存在此文件,请将 SamplePythonToolbox.pyt 放置在根 src 文件夹,然后通过 Python 命令提示符运行 python -c "import arcpy; arcpy.gp.createtoolboxsupportfiles(r'<path to toolbox>')"。
注:
请确保在运行 arcpy.gp.createtoolboxsupportfiles 之前工具箱已具有别名。 需要使用别名来生成帮助文件。
在生成的 esri 文件夹中,创建一个 toolboxes 文件夹并将 SamplePythonToolbox.pyt 移动到其中,可丢弃随附的元数据 (.pyt.xml) 文件。 esri 文件夹现在应如下所示:
esri
├──arcpy
│ └ SamplePythonToolbox.py
├──help
│ └──gp
│ ├ SamplePythonToolbox_toolbox.xml
│ ├ SampleTool_SamplePythonToolbox.xml
│ ├──messages
│ └──toolboxes
│ └ SamplePythonToolbox.xml
└──toolboxes
└ SamplePythonToolbox.pyt
注:
arcpy.gp.createtoolboxsupportfiles 不会生成 messages 文件夹;要使脚本工具或 Python 工具箱中使用的错误消息可以本地化,必须手动创建该文件夹,但是如果没有国际化的计划,则可以省略此操作。
将 esri 文件夹移动到 src\foo 目录中。 现在,用于分发的目录结构将如下所示:
Src
└──foo
├ __init__.py
├ bar.py
└──esri
├──arcpy
│ └ SamplePythonToolbox.py
├──help
│ └──gp
│ ├ SamplePythonToolbox_toolbox.xml
│ ├ SampleTool_SamplePythonToolbox.xml
│ ├──messages
│ └──toolboxes
│ └ SamplePythonToolbox.xml
└──toolboxes
└ SamplePythonToolbox.pyt
对于英语分发,无需其他步骤。 有关扩展地理处理以使用英语以外的语言进行分发的详细信息,请参阅地理处理模块的国际化。 要了解如何分发您的模块,请参阅分发地理处理模块。