ArcGIS Python编程案例(13)-自动执行Python脚本

第十二章 异常和错误处理 ||| 附录B 五个常用Python处理任务


我们将在本章介绍以下案例:

  • 通过命令行执行Python脚本
  • 使用sys.argv[]捕获命令行输入参数
  • 将Python脚本添加到批处理文件
  • 创建任务计划

引言

Python脚本既可以在ArcGIS运行环境外以独立脚本的形式来运行,也可以在ArcGIS运行环境内以脚本工具的形式来运行。两种方式都有各自的优缺点。到目前为止,所有的脚本都是在ArcGIS环境中以脚本工具形式或在Python开发环境IDLE以及ArcGIS内的Python窗口来执行。不过,Python脚本同样可以通过Windows操作系统命令行方式来执行。这种执行Python脚本的方式对于制定脚本执行任务计划来说是非常有用的。制定脚本执行任务计划有几个方面的原因,一是许多地理处理脚本的运行需要耗费很长时间通常都是安排在非工作时间来执行。另外,有一些脚本需要定时定期(每天,每周甚至每月)执行,有时候也是出于效率考虑。在本章中,你将学习如何通过命令行来执行Python脚本,将脚本添加到批处理文件中以及在指定时间来执行脚本。需要注意一点,由于代码中需要调用arcpy模块,所有通过的命令行来执行的脚本仍然需要获取ArcGIS桌面软件的许可。

通过命令行执行Python脚本

到目前为止,本书中所有的Python脚本要么在ArcGIS环境中以脚本工具形式执行,要么在Python开发环境中执行。Windows命令行为你提供了另外一种运行Python脚本的方式。命令提示窗口主要以批处理文件或任务计划的方式来执行脚本。

Getting ready

在命令提示窗口中执行Python地理处理脚本有两个方面的优势。这些脚本可以安排在空闲时间执行以获得更高的效率,同时也便于利用Python自带的错误处理和调试功能来进行调试代码。
在本案例中,你将学习如何使用Windows命令提示符来运行Python脚本。你需要获得管理员权限来完成本案例,因此你可能需要联系信息技术支持部门来修改权限。

How to do it...

按照以下步骤来学习如何通过Windows命令提示符来执行脚本:
1.Windows中点击开始|所有程序|附件|命令提示符
(Start|All Programs|Accessories|Command Prompt)
,弹出一个类似于下图的窗口:

窗口中会显示当前目录。你的目录路径会有些差异。我们来更改当前目录。
2.输入cd C:\ArcpyBook\Appendix1.
3.输入dir来查看该目录下的文件和子文件夹。你会看到只有一个叫做ListFields.py的Python文件。

4.你需要确认Python解释器能够执行。点击开始|所有程序|附件|系统工具|控制面板(Start|All Programs|Accessories|System Tools|Control Panel)

5.点击系统与安全(System and Security)
6.点击系统(System)
7.点击高级系统设置(Advanced system settings)
8.在系统属性(System Properties)对话框中,如下图所示选择高级(Advanced)选项卡,点击环境变量(Enviroment Variables)按钮:

9.按照下图所示找到Path系统变量,然后点击编辑(Edit)按钮。

10.查看C:\Python27\ArcGIS10.1目录字符串(根据个人情况修改路径)。如果没有找到该字符串,添加到最后面。确保该路径前添加分号分隔符。现在当你在命令提示符中输入python后,系统就会查找Path系统变量中的每一个目录中查找一个可执行文件python.exe。

11.点击确认(OK)按钮关闭编辑系统变量(Edit System Variable)对话框。
12.点击确认(OK)按钮关闭环境变量(Enviroment Variables)对话框。
13.点击确认(OK)按钮关闭系统属性(System Properties)对话框。
14.返回命令行提示符窗口。
15.输入python ListFields.py。系统就会运行ListFields.py脚本。等待一小会后,你会看到如下结果:

How it works...

案例中使用的ListFields.py脚本会列出Burglaries_2009.shp文件中的属性字段。工作空间路径和shapefile文件名称在脚本中都经过硬编码处理。输入python后输入脚本名称,在本案例中是ListFields.py,会触发python解释器来运行该脚本。在下一个案例中,你将学习如何将参数传递给脚本,这样就可以移除脚本中的硬编码来让脚本更加灵活。

使用sys.argv[]捕获命令行输入参数

脚本中不使用硬编码的方式来指定数据集路径,脚本通过接受命令提示符中输入的参数来执行处理任务,这将使得脚本更具有灵活性。这些输入参数可以使用Python中的sys.argv[]对象来捕获。

Getting ready

Python中的sys.argv[]对象允许脚本在执行过程中接受命令行传递的输入参数。如下图所示的例子很好地说明了这一工作机制:

每一个参数都用空格隔开。这些参数都保存在一个sys.argv[]的列表对象中。使用索引值0来引用sys.argv[]列表中的第一个元素,即脚本名称。在本案例中脚本名称为ListFields.py。依次使用递增的整数索引值来引用后续的元素。因此,第一个参数(C:\ArcpyBook\data)保存在sys.argv[1]中,第二个参数(Burglaries.shp)保存在sys.argv[2]中。每一个sys.argv[]列表对象中的参数都可以在地理处理脚本中获取并使用。在本案例中,你需要修改ListFields.py脚本文件来接受命令行输入的参数。

How to do it...

按照以下步骤来创建一个使用sys.argv[]来接受命令行中输入的参数的脚本:
1.在IDLE中打开C:\ArcpyBook\Appendix1\ListFields.py文件。
2.导入sys模块:

import arcpy,sys

3.创建一个变量来保存工作空间参数:

wkspace = sys.argv[1]

4.创建一个变量来保存要素类参数:

fc = sys.argv[2]

5.更新设置工作空间路径以及调用ListFields()函数的相关代码:

arcpy.env.workspace = wkspace
fields = arcpy.ListFields(fc)

完整代码如下:

imprt arcpy,sys
wkspace = sys.argv[1]
fc = sys.argv[2]
try:
    arcpy.env.workspace = wkspace
    fields = arcpy.ListFields(fc)
    for fld in fields:
        print fld.name
except:
    print arcpy.GetMessages()

6.保存脚本。
7.打开命令提示符窗口,更改当前目录至C:\ArcpyBook\Appendix1
8.在命令提示符窗口中,输入以下命令后按下Enter键:

python ListFields.py C:\ArcpyBook\data Burglaries_2009.shp

9.你会再一次看到Burglaries.shp文件中属性字段的细节信息。不同之处在于你的脚本不再需要硬编码工作空间路径和要素类名称。脚本现在可以列出任何要素类的属性字段。

How it works...

sys模块中包含了一个argv[]的列表对象,该对象用于保存在命令行模式下执行Python脚本的输入参数。列表中的第一个元素是脚本名称。因此,在本案例中sys.argv[0]包含了ListFields.py文本。工作空间和要素类参数分别保存在sys.argv[1]sys.argv[2]中。这些输入参数赋值给变量在脚本中使用。

添加Python脚本至批处理文件

如果要在指定的时间执行Python脚本,你需要创建一个包含一个或多个脚本文件,必要情况下还可以包含操作系统命令的批处理文件。批处理文件可添加到Windows系统的任务计划中在指定的时间内执行。

Getting ready

批处理文件是一个文本文件,该文件中包含有执行脚本的命令行代码或操作系统执行命令。批处理文件的扩展名为.bat,Windows将其视为可执行的文件。由于批处理文件中只包含有命令行代码,因此可以使用任何一个文本编辑器来编写,尽管如此我们还是建议你使用像记事本(Notepad)这样简单的文本编辑器,可以避免包含一些不可见的特殊字符,而这类字符可能会在Microsoft Word中出现。在本案例中,你将创建一个简单的批处理文件来定位至包含有ListFields.py文件的目录中,并执行该脚本文件。

How to do it...

按照以下步骤来创建一个批处理文件:
1.打开记事本(Notepad)。
2.添加以下文本:

cd /d C:\ArcpyBook\Appendix1
python ListFields.py C:\ArcpyBook\data Burglaries_2009.shp

3.将文件保存为桌面上的ListFields.bat文件。确认选中保存文件类型
(Save as Type)
中的下拉列表中的所有文件(All Files),否则文本会保存为ListFields.bat.txt文件。
4.双击桌面中的ListFields.bat文件来执行命令代码。
5.在执行过程中会弹出一个命令提示符窗口。执行完成后,该窗口会自动关闭。

How it works...

Windows系统将批处理文件视为可执行文件,因此双击批处理文件会自动弹出一个新的命令提示符窗口来执行批处理文件中的命令行代码。所有的print语句都会写入到窗口中。代码执行完成后,命令提示符窗口会自动关闭。如果你想跟踪输出结果,你可以将结果写入到一个日志文件中。

There's more...

批处理文件中可以包含变量,循环语句,注释以及条件逻辑语句。这些功能已经超过本书范围。不过,如果你需要给单位编写大量脚本的话,还是值得花些时间来多了解批处理文件的知识。更多关于关于批处理文件的信息,你可以在Wikipedia中查看。

创建任务计划

批处理文件创建完成后就可以在Windows任务计划程序中创建任务计划,在指定时间来自动执行处理任务。

Getting ready

许多地理处理脚本都是非常耗时的,最好是安排在非工作时间内执行,这样既可以充分利用系统资源也可以让你将精力放在其他任务中。在本案例中,你将学习如何使用Windows任务计划程序来设置执行批处理文件的任务计划。

How to do it...

按照以下步骤在Windows任务计划程序中设置批处理文件的任务计划。
1.点击开始|所有程序|附件|系统工具|控制面板|管理工具
(Start|All Programs|Accessories|System Tools|Control Panel|Administrative Tools)
选择任务计划(Task Scheduler)打开任务计划程序。任务计划程序界面如下图所示:

2.选择操作(Action)菜单项后选择创建基本任务(Create Basic Task)弹出创建基本任务向导(Create Basic Task Wizard)对话框。
3.设置任务名称。在本案例中我们将任务名称设置为List Fields from a Feature Class。点击下一步(Next)

4.选择任务执行时的触发器。通常选择基于时间触发器,不过也可以设置为其他类型的触发器,比如用户登录时或计算机启动时等。在本案例中,我们选择每天(Daily)。点击下一步(Next)

5.选择一个开始的日期时间以及执行周期。如下图所示,我选择开始时间为2012年12月31日上午1点,每隔1天执行一次。因此每天凌晨1点都会执行该任务。点击下一步(Next)

6.在操作中选择启动程序(Start a program)

7.找到你的批处理文件并添加参数。这里需要说明一下,大家可以选择直接打开前一个案例创建的bat批处理文件后直接点击下一步(Next),也可以如下图所示,导入创建的python脚本文件,在添加参数(Add argument)中输入C:\ArcpyBook\data Burglaries_2009.shp后点击下一步(Next)

8.点击完成(Finish)添加任务任务计划中。

9.任务现在显示在活动任务列表中:

How it works...

Windows任务计划程序会追踪所有的活动任务并会在预定义触发器触发时来执行这些任务。在本案例中,我们安排任务在每天凌晨1点执行。也就意味着每天凌晨1点批处理文件将被触发,同时创建任务时指定的参数会传递给脚本。使用任务计划程序可以在不需要GIS人员的干预的非工作时间自动执行地理处理任务,这将给你带来更多灵活性并提高工作效率。你还可以将Python脚本中的错误记录到一个日志文件中来查看问题的详细信息。


第十二章 异常和错误处理 ||| 附录B 五个常用Python处理任务

推荐阅读更多精彩内容