我设置了一个库和关联的 ArcGIS Toolbox,以便:
/root
├── Toolbox.atbx
├── mylib
│ └── my_function.py
├── my_tools
│ └── my_gp_script.py
我将代码存储库的开发克隆保存在公司共享服务器上的一个位置,并在 GitHub 上托管一份副本。当我进行更新时,我会同步共享版本,公司的其他人可以访问该版本来运行工具箱中提供的工具。因此,我需要这个结构是相对的和可移植的。
工具箱内的每个工具都嵌入了执行 my_tools 文件夹内的脚本工具的代码:
exec(open('my_tools/my_gp_script.py').read())
这些脚本然后通过 arcpy 编译和修改所需的参数,并且执行诸如 my_function.py 之类的函数。
这一切都运行良好,直到 ArcPro 3.2 更新(尽管从技术上讲我从 3.1 跳到了 3.3),其中从工具箱内执行 Python 脚本工具的方式发生了变化。| ||请参阅 ESRI 的参考(向下滚动到 Python 脚本工具,向下第二个响应):
https://community.esri.com/t5/python-documents/python-in-arcgis-pro-3- 2-faq/ta-p/1348851 其要点是:
在 3.1 中的值
是:
在执行期间:
__file__
在 3.2 中
C:\Path\MyToolbox.atbx#MyTool_MyToolbox.py
中的值是:
在执行期间:
__file__
在此更改之后,my_gp_tool.py 不再能够直接调用
C:\Path\MyToolbox.atbx\MyTool.tool\tool.script.execute.py
,因为它现在是从与源 Toolbox 不同的目录中执行的。
import mylib
我有一个临时解决方案我可以在每个脚本的开头添加
的地方,但这对我来说似乎有点臭。它还将该目录添加到整个 ArcPro 会话的 python 路径中,因为每次启动程序时都会加载一个 python 内核 - 这似乎可能会产生其他意想不到的效果。
sys.path.append(os.path.dirname(__file__.split(".atbx")[0]))
还有其他人处理过吗这个特定的更新问题?我应该重新配置根文件夹的布局方式吗?我更喜欢让工具箱的根目录相对干净,然后本质上是一个脚本文件夹(my_tools)和一个库文件夹(mylib),但也许这从一开始就是错误的。我真的不想让人们在他们的用户设置上安装我的库,因为这会让更新成为一场噩梦,并且需要人们克隆源库并进行一系列会分散用户注意力的设置。
Has anyone else dealt with this particular update issue? Should I reconfigure how I have my root folder laid out? I rather liked having the root be relatively clean with the toolbox, and then essentially a scripts folder (my_tools), and a library folder (mylib), but maybe this was wrong from the start. I don't really want to have folks install my library on their user settings since this would make updates a nightmare, and require people to clone the source library and do a bunch of set up that will detract users.
遇到的问题很常见,并且是由于 ArcGIS Pro 3.2 中 Python 脚本工具执行环境的变化导致的。当前的临时解决方案确实有效,但正如所指出的,它并非理想选择,并且可能会导致问题。
以下是一些可以采用的更强大的解决方案:
1. 使用相对路径导入
与其将库路径添加到
sys.path
,不如使用相对路径直接从脚本工具导入模块。 这可以通过修改
my_gp_script.py
来完成,如下所示:
import os
import sys
# 获取脚本目录的绝对路径
script_dir = os.path.dirname(os.path.abspath(__file__))
# 将库目录添加到 Python 路径
library_dir = os.path.join(script_dir, '..', 'mylib')
sys.path.insert(0, library_dir)
# 现在,可以导入所需的模块
import my_function
# 的脚本工具代码的其余部分
# ...
此方法确保脚本始终可以找到库,而不管工具箱的位置如何。
2. 将库打包为 Python 包
更强大的解决方案是将库打包为 Python 包。这使可以更轻松地分发和安装库,并避免与相对路径相关的任何问题。
为此,需要创建一个
setup.py
文件,并在库目录中创建一个
__init__.py
文件。以下是示例:
/root
├── Toolbox.atbx
├── mylib
│ └── __init__.py
│ └── my_function.py
├── my_tools
│ └── my_gp_script.py
└── setup.py
setup.py
文件的内容可能如下所示:
from setuptools import setup, find_packages
setup(
name='mylib',
version='0.1.0',
packages=find_packages(),
)
创建包后,可以使用
pip
在本地或共享服务器上安装它:
pip install . -e
安装后,可以像导入任何其他 Python 包一样从脚本工具导入库:
from mylib import my_function
3. 使用 ArcGIS Pro 项目包 (.arcpyproj)
如果希望将工具箱和库捆绑在一个可分发的包中,可以考虑创建一个 ArcGIS Pro 项目包 (.arcpyproj)。此包可以包含的工具箱、库和任何其他必需的文件或数据。然后,用户可以将包安装到其 ArcGIS Pro 实例中,并以这种方式访问这些工具和库。
建议:
- 使用相对路径导入 是一个简单的解决方案,适用于较小的项目。
- 将库打包为 Python 包 是更强大的解决方案,建议用于大型或复杂的库。
- 使用 ArcGIS Pro 项目包 是在单个包中分发工具箱和库的便捷方法。
选择最佳解决方案取决于的特定需求和项目复杂性。
标签:python,arcgis,arcpy From: 78840745