创建地理处理模块

自定义 Python 工具箱可以作为 Python 包进行分发。 构建和分发工具箱包括创建 Python 包和使用 esri 文件夹扩展包结构以包含您自己的工具箱。 在 Python 环境中安装包后,您的工具箱的显示和访问方式将与 ArcGIS Pro 中系统工具箱的显示和访问方式相同,即可通过地理处理窗格arcpy 进行访问。 此外,针对消息分发、基于语言的帮助以及对本地化设置的响应,自定义地理处理模块可以利于 ArcGIS Pro 系统工具箱拥有的一套成熟方法。

创建 Python

出于说明的目的,我们将创建一个名为 fooPython 包,其中包含 bar.py 模块。

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 目录视为一个包。

__init__.py

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

自定义工具箱(.tbx.pyt)以及所有支持 .py 文件位于 esri\toolboxes 目录中。 工具箱和工具箱元数据(.xml)文件存储在 esri\help\gp 文件夹中。 工具箱 .xml 文件的命名约定是工具别名加上 _toolbox.xml,而对于工具,命名约定是工具名和工具箱别名用下划线隔开,并具有扩展名 .xml。 所有地理处理消息 .xml 文件都存储在 esri\help\gp\messages 目录中。 这些消息文件在 Python 工具箱中用于需要进行国际化的消息。

通过创建名为 SamplePythonToolbox 的 Python 工具箱,可以演示通过 Python 包扩展地理处理的过程。

了解有关创建 Python 工具箱的详细信息
SamplePythonToolbox.pyt

用于创建 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 放在一个单独的暂存文件夹中,然后运行 arcpy.gp.createtoolboxsupportfiles(<path to .tbx or .pyt>)

注:

请确保在运行 arcpy.gp.createtoolboxsupportfiles 之前工具箱已具有别名。 需要使用别名来生成帮助文件。

esri 文件夹内创建 toolboxes 文件夹,然后将 SamplePythonToolbox.pyt 及其随附的 .xml 文件放在该文件夹中。 暂存文件夹现在应如下所示:

Staging
 └──esri
     ├──arcpy
     │   └  SamplePythonToolbox.py
     ├──help
     │   └──gp
     │       ├  SamplePythonToolbox_toolbox.xml
     │       ├  SampleTool_SamplePythonToolbox.xml
     │       ├──messages 
     │       └──toolboxes
     │           └  SamplePythonToolbox.xml
     └──toolboxes
         ├  SamplePythonToolbox.pyt
         ├  SamplePythonToolbox.pyt.xml
         └  SamplePythonToolbox.SampleTool.pyt.xml
注:

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
            ├  SamplePythonToolbox.pyt.xml
            └  SamplePythonToolbox.SampleTool.pyt.xml

对于英语分发,无需其他步骤。 有关扩展地理处理以使用英语以外的语言进行分发的详细信息,请参阅地理处理模块的国际化。 要分发您的模块,请参阅分发地理处理模块

相关主题