编程语言
首页 > 编程语言> > 教程(五)— FME中的关闭Python脚本

教程(五)— FME中的关闭Python脚本

作者:互联网

前言

本文是五篇系列文章中的最后一篇,主要介绍了如何在FME Workbench中使用“关闭Python脚本”功能,并且分别列举了通过电子邮件发送转换统计信息,使用默认应用程序打开输出数据集以及写入转换历史日志等三个示例。

1.介绍

Python脚本不仅可以在工作空间开始运行前被执行,也可以等工作空间运行完成后再执行,这就是“关闭Python脚本”功能。当您想在工作空间运行完后将文件复制到某个地方,又或者是使用非DataInspector的应用程序打开输出数据集的时候都可以用到它。

“关闭Python脚本”功能将在成功完成并关闭所有转换器,读模块,写模块和日志文件后再运行。而在工作空间运行失败的情况下,该脚本仍然会执行,但可能也会失败,因为此时只有fme.status和fme.failureMessage能保证包含有效的数值供“关闭Python脚本”功能调用。

如“启动和关闭Python脚本”的“帮助”页面上所述,这里不建议将FME Objects Python API中的任何模块与“关闭Python脚本”功能一起使用,因为此时FME Objects所需的资源将不再可用,因此对API的调用将产生不可预测的结果。

然而,您还是可以使用fme.macroValues[]字典,以与“启动Python脚本”、脚本化参数和PythonCaller中相同的方式访问FME参数值。除此之外,“关闭Python脚本”还可以访问FME创建的许多全局变量,例如fme.featuresRead,fme.featuresWritten等。并且,该脚本可以访问在“启动Python脚本”中设置的所有全局Python变量。

2.示例1:电子邮件转换统计

(示例模板(如下图):ShutdownPython1.fmw)

图片

在此示例中,我们向工作空间添加了“关闭Python脚本”(如下图),当工作区完成时,该脚本会使用Gmail发送电子邮件(当然,您也可以根据需要编辑脚本以使用其他邮件服务器)。这里发送的电子邮件的主题中,将说明工作空间是否成功,并写明写出要素的数量。当然,此任务也可以通过使用Emailer转换器来完成。

接下来让我们来具体分析一下所给的示例模板。打开ShutdownPython1工作空间,然后在“导航器”窗口中的“工作空间参数”>“脚本”下,您将看到一个名为ShutdownPython Script的参数(如下图)。

图片

关闭Python脚本”在“导航器”窗口中的位置

 

此处您可以输入或查看Python代码(如下图),图中代码功能为将使用Gmail帐户发送电子邮件。

图片

该脚本将导入smtplibfme模块,从而分别提供电子邮件工具和FME词典访问权限。紧接着,脚本下一节将检索用户设置的FME参数。之后,脚本将获取写出的要素数量,并将其转换为文本。而后,if / else语句将根据转换是成功还是失败来确定要使用的消息文本。然后最后一部分脚本代码将用于使用Gmail smtp服务器发送电子邮件。

 

关于这个脚本,有两个需要注意的要点:

第一点是,我们使用fme.macroValues []字典来获取用户参数的方法与前面关于“启动Python脚本”和“Python脚本参数”文章中的示例是相同的。例如,可以在运行工作空间时设置Gmail用户名,并可以从发布的参数(如fme.macroValues['GmailUser'])访问Gmail用户名。

第二点是,要注意我们所使用的两个全局变量是来自FME模块:fme.featuresWritten的,它是一个以要素类型和fme.status为索引的Python字典。而fme.status是一个布尔值,它将告诉我们工作空间运行是成功还是失败的。

通过点击工作空间菜单栏“文件”>“使用提示运行”来运行该示例模板,或者选择“提示并运行”按钮,然后点击“运行”,则将出现“转换参数”对话框(如下图)。在这里填写合适的参数,例如所要使用的Gmail帐户用户名(电子邮件地址)和密码,以及发送电子邮件的地址,该地址应与用户名相同。另外,还需填写收件人电子邮件地址(可以与发件人电子邮件地址相同)以及失败和成功的邮件主题语句。在所给的示例工作空间中,“失败”参数(Tester中的NO),将用于通过将要素发送到Terminator转换器来模拟工作空间故障。

确定好参数后,点击Run确定运行。

图片

ShutdownPython1.fmw的转换参数对话框

 

**注意:如果您的Gmail帐户启用了双重身份验证,则可能需要生成与您的Gmail帐户相关联的应用密码。这个应用密码,您可以通过登录到您的Gmail帐户,在“我的帐户”>“登录和安全”下找到一个页面,以生成应用程序密码。生成密码后,在运行工作区时输入应用密码作为密码即可。而如果您使用的是普通密码,则Python脚本可能无法执行,并显示消息“用户名和密码未接受”的报错情况。

示例模板运行完成后,您(或您设置的收件人)应该会很快收到由“关闭Python脚本”发送的电子邮件。如果fail参数选择“否”,则它应该看起来像下图这样:

图片

如果fail参数选择“是”,则由“关闭Python脚本”发送的转换失败的电子邮件示例如下:

图片

3.示例2:使用默认应用程序打开输出数据集

(示例模板:ShutdownPython2.fmwt

图片

ShutdownPython2.fmwt从CSV读取树数据,按邻域聚合数据并以CSV格式写出。

在FME Workbench中,用户可以选择将数据写入到DataInspector中查看。那么,如果用户想使用数据对应的默认应用程序自动打开目标数据集该怎么操作呢?这也可以通过使用“关闭Python脚本”来实现。

在所给示例模板ShutdownPython2.fmwt中,我们使用“关闭Python脚本”在转换完成后打开CSV文件(在本示例中选择CSV文件,是因为它是大多数用户可以打开的文件格式)当然,您完全能够使用该脚本通过其他格式的默认应用程序打开其他文件格式。

接下来让我们看一下该示例模板的思路。打开ShutdownPython2.fmwt工作空间,可以看到该模板界面非常简单。这个模板的功能是从CSV文件中读取出温哥华市内的每颗树数据。模板中,读模块后紧跟一个AttributeManager转换器用于删除不需要的属性,而后连接一个Aggregator转换器用来寻找在附近的树木数量,并找到附近的所有树木的平均高度和直径。最后获取的数据将以CSV文件的形式被写出。

在该示例模板中,“关闭Python脚本”被用于调用计算机上设置的默认应用程序打开输出的CSV文件。我们可以在“导航器”窗口中,“工作区参数”>“脚本”>“关闭Python脚本”以查看该脚本(如下图)。

图片

该脚本比较简单,它使用subprocess和fme模块,查找并创建一个包含输出数据集文件路径的变量。该变量与subprocess模块的Popen构造函数一起使用,以创建一个子流程,该子流程将使用文件格式对应的默认应用程序打开输出数据集。

该脚本中使用Popen构造函数而不是subprocess.call (),因为call()将使用与转换引擎(FME.exe)相同的过程,这意味着直到用户关闭用于打开输出数据集的应用程序,转换才会完成。而在Popen()构造函数创建子进程时,则可以在转换后关闭FME.exe。

重要说明:通常不建议对Popen构造函数使用shell = True参数,因为这会使程序容易受到Shell注入的攻击,如果与不受信任的输入结合使用,可能会带来安全隐患。有关更多信息,请参见官方Python文档:Python PopenConstructor。

但如果您确实希望使用shell = False作为参数,取消注释以下行即可:

P = subprocess.Popen(["<DefaultApplicationFilePath>","<OutputDatasetFilePath>"], shell=False)

即将<DefaultApplicationFilePath>和<OutputDatasetFilePath>替换为适用的文件路径,确保引用被保留,然后注释掉包含shell = True的行。

模板设置完毕后,在计算机上设置为CSV文件格式默认设置的应用程序应自动启动,并且您应该能够查看和编辑输出CSV文件。然后在确保启用“提示运行”的情况下运行工作空间。这时,运行完成后应当有6个要素写到输出CSV文件中。转换日志如下图所示:

图片

转换日志窗口中的消息说输出CSV文件成功打开。如果无法打开CSV文件,则会显示一条错误消息。

4.示例3:创建转换历史记录日志

(示例模板:ShutdownPython3.fmw

如果工作空间多次运行或按计划运行,用户如何跟踪转换呢?(例如:https://community.safe.com/s/article/batch-processing-method-1-command-line-or-batch-fi文章中所示)。当然,这种情况如果在FME Workbench中选择了“追加到日志”选项,或者您已指定要在批处理文件中创建的日志历史记录,则可以直接浏览日志文件跟踪转换。但是,除此之外我们还有另一个选择,即使用“关闭Python脚本”为特定工作空间创建转换历史日志。

在所给示例模板中,“关闭Python脚本”将用户可能感兴趣的属性创建或添加到CSV日志中,例如转换状态、转换日期和时间、读取要素或写出要素,转换花费了多长时间等。不难想到,该脚本将利用许多fme模块的全局变量。

打开所给示例模板(ShutdownPython3.fmw),可以看到该工作空间非常简单,包含Sentinel2读模块,Tester转换器,GeoTIFF写模块和Terminator转换器。该示例模板的功能是检索符合用户条件的最新图像,并将图像写成GeoTIFF栅格(如下图)。

图片

在“工作区参数”>“脚本”下的“导航器”窗口中,您将看到一个名为“关闭Python脚本”的参数。双击打开脚本编辑器窗口,可以看到如下图代码。

图片

为简单起见,该转换历史记录日志将在与工作空间相同的文件夹中创建,并具有与工作空间相同的名称。

该脚本使用fme.macroValues []字典来获取包含工作空间的文件夹路径以及带有宏(预定义参数)“ FME_MF_DIR”和“ WORKSPACE_NAME”的工作空间名称,以创建转换历史文件的文件路径。

此外,该脚本通过if / else语句控制CSV文件的写入/添加。其中,第一个if / else使用path.exists()检查转换历史文件是否存在,如果工作空间之前未运行过,则不会有转换历史记录日志(path.exists()将为False)。而CSV日志将使用二进制写入('wb')模式通过内置的Python函数open()打开。

接下来,脚本将写入两行内容:第一行为标题行(当该行不存在的时候);第二行为包含详细转换信息的行。其中详细细节内容可以通过全局变量访问,如访问fme.elapsedRunTime,fme.totalFeaturesWritten,fme.totalFeaturesRead等相关完整FME列表功能,均可用于“关闭Python脚本”变量。

而如果工作空间以前已经运行过,那么转换历史文件将已经存在,因此将使用二进制模式(' ab ')进行追加。此时Append将写入文件的末尾,这意味着先前的行不会被覆盖和丢失。此外,由于已经存在另一个标题行,因此将另一个标题行写入文件是没有意义的,所以此时仅会写入包含详细转换信息的行。

第二条if / else语句使用fme.status变量检查转换状态。但是需要注意的是,如果转换失败,则只能保证fme.status和fme.failureMessage包含有效值。为了避免可能出现的值无效问题,如果fme.status不是True(即转换失败),则仅会写入日期,时间,转换状态和失败信息。

脚本编写完成后,运行工作空间,在“终止转换”参数栏输入“否” (如下图),然后输入要在其中写入输出的位置,这些要素通过Tester转换器中passed端口输出并保存到文件夹。

图片

工作空间运行完成后,我们可以看到一个与工作空间同名的CSV文件(此示例为ShutdownPython3.csv)被生成。打开该文件,我们将看到如下两行:标题行和包含刚刚完成的转换的详细信息的行(如下图)。关闭CSV文件。

图片

工作空间成功运行后,转换历史记录日志显示内容

接下来返回工作空间,将“终止转换”参数选择为“是”之后,再一次运行该工作空间。这次,由于要素均从Tester转换器的Failed端口输出,所以本次转换将失败(日志窗口内容如下图)。

图片

此时,我们打开转换历史文件可以看到第三行仅包含了日期,时间,转换状态和失败信息(如下图)。

图片

现在,您可以使用.bat文件(或类似的OS文件),设置一个计划任务程序或通过FME Workbench手动运行工作空间,则可以在生成文件中查看关于每个工作空间运行情况记录信息了。

5.数据来源

此处使用的数据来自不列颠哥伦比亚省温哥华市提供的开放数据,其中包含根据“开放政府许可证-温哥华”获得许可的信息。

 

点击链接获取文内模板,提取码:2021

https://pan.baidu.com/s/1_g1enQaQ5ns04TnLEuIhCw

标签:脚本,教程,fme,转换,CSV,示例,Python,FME
来源: https://blog.csdn.net/fmechina/article/details/116233635