span8
span4
本文是5部分组成的系列,以帮助您开始使用基本的Python和FME的第5部分。这篇文章是关于使用Workbench中的关机Python脚本的功能,包括使用关机Python脚本电子邮件翻译的统计数据中,打开该文件格式的默认应用程序,并写入到翻译历史日志输出数据集的例子。
可以将Python脚本添加到工作空间中,该工作空间将在工作空间完成时运行。例如,您可能希望在工作空间完成时将文件复制到某个地方,或者使用非数据检查器的应用程序打开输出数据集。
关机脚本后,所有的变压器,读者,作者的运行,并在日志文件中的一个成功的翻译关闭。在一个失败的翻译的情况下,该脚本将仍然执行,但可能会失败,因为只有FME。状态和fme.failureMessage保证包含有效值。
至于帮助页面上提到的启动和关闭脚本,但不建议使用从FME对象的Python API与关机脚本,因为FME对象所需资源不再可用,因此调用API会产生不可预知的结果的任何模块。
但是,您可以以同样的方式访问FME参数值作为启动脚本,脚本参数,并使用PythonCaller的fme.macroValues []字典。停堆Python脚本也可以访问一些全局变量,其FME产生如fme.featuresRead,fme.featuresWritten, 还有很多。此外,该脚本可以访问任何全局变量的Python在启动Python脚本设置。对于全局变量的完整列表,请参阅启动和关闭Python脚本帮助页面,该主题下FME_END_PYTHON。
附工作区:ShutdownPython1.fmw
在本例中,我们将一个shutdown Python脚本添加到一个工作空间中,当工作空间完成时,它将使用Gmail发送一封电子邮件。如果愿意,可以编辑脚本以使用其他邮件服务器。电子邮件的主题将说明工作空间是否成功,并包括所编写的功能的数量。类似的例子也可以在帮助页面中找到启动和关闭Python脚本。这个任务也可以使用完成的emailer变压器。
打开ShutdownPython1工作区(见上文下载部分)和下导航窗格工作空间参数>脚本,你会看到一个名为参数关机 - Python脚本。在这里,您可以输入或查看Python代码下面将发送使用Gmail帐户的电子邮件。
在Navigator窗格中关闭Python脚本参数的位置
该脚本进口的smtplib和FME模块,分别给出电子邮件的工具,并获得FME字典。下一节将检索由用户设置的参数FME。然后脚本获取的书面特征的数量和数字转换成文字。该if / else语句决定根据转换是否成功或失败要使用的邮件文本。最后一节使用Gmail的SMTP服务器发送电子邮件的交易。
#该给的smtplib我们发送电子邮件工具导入的smtplib,FME#获得FME的参数值时,设置工作区运行于= fme.macroValues [ 'EmailTo'] = gmail_user fme.macroValues [ 'GmailUser'] = gmail_pwd fme.macroValues ['密码']主题= fme.macroValues [' SuccessSubject '] FailSubject = fme.macroValues [' FailSubject '] Emailfrom = fme.macroValues [' EmailFrom']的功能FME写#获取数FeaturesWritten = STR(fme.featuresWritten)#如果FME失败,那么更改主题#立即将fme_status告诉FME是否成功状态= fme.status如果状态== 0:主题= FailSubject消息=“工作区失败”其他:消息=“工作区成功以下特点写:” + FeaturesWritten#发送电子邮件#使用Gmail的SMTP服务器#你可以编辑该行使用自己的电子邮件服务器SMTPSERVER = smtplib.SMTP( “smtp.gmail.com”,587)smtpserver.ehlo()smtpserver.starttls()smtpserver.ehlo()smtpserver.login(gmail_user,gmail_pwd)报头= '收件人:' +到+ '\ n' + '来自:' + Emailfrom + '\ n'+ '主题:' +主题+ '\ n' 打印头MSG =报头+ '\ n' +消息+ '\ n \ n' smtpserver.sendmail(gmail_user,于,MSG)打印 '完成!'smtpserver.close()
有两点需要注意:
我们正在使用。获取用户参数fme.macroValues []字典中相同的方式由启动 - Python脚本和脚本参数文章的例子。例如,Gmail用户名可以当工作区运行,并从这样的发布的参数访问设置:fme.macroValues [ 'GmailUser']。
湾其次,注意我们使用了两个全局变量FME模块:fme.featuresWritten哪个是按功能类型索引的Python字典fme.status这是一个布尔值,告诉我们工作区是否成功或失败。
使用以下命令运行工作区文件>与提示符下运行或选择提示和运行按钮,那么运行按钮。将出现一个转换参数对话框。填写相应的参数。您将需要自己的Gmail帐户的用户名(电子邮件地址)**和密码,这应该是相同的用户名来自 - 电子邮件地址。此外,填写到电子邮件地址(可以是相同的电子邮件地址)和失败和成功的主题行。在所附的示例工作区的故障参数是通过发送功能终结者变压器用来模拟工作区失败。单击确定发送。
**注意:如果您的Gmail帐户启用了双因素身份验证,您可能需要生成一个与Gmail帐户关联的应用程序密码。登录到您的Gmail帐户,你会发现一个页面,以生成应用程序密码下我的帐户>登录&安全。一旦您生成了一个,在运行工作区时输入应用程序密码作为您的密码。如果您使用正常的密码,Python脚本可能无法执行“用户名和密码不被接受”的消息。
请参阅身份验证问题的详细信息,在使用Gmail时,下面的两个知识中心文章:
IMAP出版物或电子邮件订阅不是阅读来自Gmail的电子邮件
使用Gmail作为FME服务器电子邮件订阅服务器时的身份验证问题
翻译参数对话框关闭python1 .fmw
您(或您的收件人)将很快收到由shutdown Python脚本发送的电子邮件。如果你为fail参数选择“No”,它应该是这样的:
成功的翻译邮件的发送例如由关机脚本
或者,如果你选择了“是”为失败参数:
关闭脚本发送的翻译邮件失败的示例
附工作区:ShutdownPython2.fmwt
随着工作台,用户必须重定向数据集(S)写入数据检查的选项。然而,如果用户想要与数据的默认应用程序会自动打开目标数据集是什么?停堆Python脚本可以用来这样做。
在这个例子中,我们使用关机Python脚本打开一个CSV文件翻译完成后。之所以选择这个例子CSV文件,因为它是一种文件格式,大多数用户可以打开。但是,你应该能够打开其他文件格式,使用该脚本格式的默认应用程序。
打开ShutdownPython2.fmwt。工作空间是相当简单的。它从一个CSV文件温哥华市的范围内读取单个树数据。一个AttributeManager用于删除不需要的任何属性。一个聚合是用来计算一个街区内树木的数量,以及一个街区内所有树木的平均高度和直径。输出以CSV文件的形式输出。
ShutdownPython2工作区。fmwt从CSV中读取树数据,按邻居聚集数据,并以CSV格式写入输出。
关机脚本用于打开你的计算机上的默认应用程序集的输出CSV文件。在导航窗格中,去工作区参数>脚本>关闭Python脚本查看脚本或复制以下它,如果你要创建一个拥有自己的数据的工作区。
进口子,FME,SYS共同CSV默认应用程序的路径#在Windows 64位#R “C:\ Program Files文件(x86)的\的Microsoft Office \ Office15 \ EXCEL.EXE” #R“C:\ Program Files文件(86)\记事本++ \记事本++ exe文件” R” C:\ WINDOWS \ SYSTEM32 \ NOTEPAD.EXE”#使用FME的宏值字典来获得输出outputDir = fme.macroValues的目录位置[ 'DestDataset_CSV2']#使用FME的宏值字典来获得输出文件名outputName = fme.macroValues [ 'csv_file_name']#追加的目录和文件名来获得输出文件的文件路径outputPath = '{} \\ {}。{}'。格式(outputDir,outputName, 'CSV')#用于调试#PRINT打印功能(outputPath)#使用子模块与默认应用程序尝试打开输出文件:#使用shell = false时,应指定默认的应用程序和OUTPUTFILE#取消下面的行中,添加完整的文件路径您的适用文件路径,并出含壳行注释= TRUE。#P = subprocess.Popen([ “”, “ ”],壳=假)P = subprocess.Popen([outputPath],壳=真)的打印( “输出CSV文件成功打开”),除了例外为e:打印( “SHUTDOWN脚本失败错误:”,E)
该脚本是相对比较简单。使用子流程和FME模块,脚本查找并创建一个包含输出数据集的文件路径的变量。此变量与子流程模块的POPEN构造函数来创建其打开带有格式的默认应用程序的输出数据集的一个子进程。
使用的是Popen构造函数而不是subprocess.call()因为呼叫()将使用相同的过程,作为翻译引擎(FME.exe),这意味着你的翻译将无法完成,直到用户关闭它是用来打开输出数据集的应用程序。由于POPEN()构造函数创建了一个子进程,可以在转换之后关闭FME.exe,并且在打开的应用程序关闭之前工作区不会挂起。
重要的提示: 使用壳=真论点的Popen一般不推荐的构造因为这使得容易受到壳注射程序,并且可以是一个安全危险如果与不可信的输入组合。欲了解更多信息,请参阅此处Python官方文档:Python的POPEN构造。该壳=真参数用于简化,因为它不需要指定应用程序路径。在这种情况下,由于工作空间用户负责命令的输入,所以它造成的安全风险更小。然而,需要您自担风险使用它。
如果您希望使用shell = False作为参数,取消以下线:
P =子流程。Popen(["", " "], shell=False)
取代
确保运行提示启用和运行工作区。输入您的参数或保留为默认值。6个特性应写入到输出CSV文件。应用程序设置为默认的CSV文件格式,你的机器上应自动启动,你应该能够查看和编辑输出CSV文件。
消息在转换日志窗格中说输出CSV文件成功打开。如果CSV文件无法打开,会出现错误信息,而不是出现。
GIF演示关机Python脚本的行为。请注意,微软Excel打开输出CSV文件工作区时结束。
附加工作区:ShutdownPython3.fmw
如果一个工作空间被多次运行或者按照一个时间表运行(例如:如图所示),用户如何跟踪翻译批处理方法1:命令行或批处理文件文章)?当然,你可以通过看日志文件,如果“附加到日志”选项在Workbench中选择(在这里看到的日志文件)或指定要在批处理文件中创建的日志历史记录。但是另一个选项是使用shutdown Python脚本为特定的工作空间创建一个翻译历史日志。
在本例中,关闭脚本将创建或附加到CSV日志中,其中包含用户可能感兴趣的属性,如翻译状态、翻译日期和时间、读或写的特性、翻译花费的时间等。为此,脚本利用了大量的FME模块的全局变量。
打开附加工作区(ShutdownPython3.fmw-请参阅上面的下载部分)。工作区非常简单,包含Sentinel2读取器、测试器、地理tiff写入器和终结者。这个工作空间将检索符合读者标准的最新图像,并将图像写成GeoTIFF光栅。
一个非常简单的工作区这表明使用关机Python脚本来创建一个翻译的历史记录。
在下面的导航窗格工作空间参数>脚本,你会看到一个名为参数关机 - Python脚本。双击以打开脚本编辑器窗口。如果您正在创建自己的工作空间,请复制并粘贴下面的Python代码,该代码将创建翻译历史日志或附加翻译详细信息。
# fme,导入模块导入csv, datetime从操作系统导入路径#得到当前日期和时间dateToday = datetime.date.today () .strftime (' % Y / % m / % d ') timeNow = datetime.datetime.now () .time () .strftime (% h . % m % S) #得到工作区目录路径#用正斜杠替换反斜杠workspacePath = fme避免转义字符的问题。['FME_MF_DIR'] workspacePath = workspacePath.replace('\\','/') #获取工作区名称workspaceName = fme。创建主文件的路径masterFile = '{}{}.csv'。格式(workspacePath, workspaceName)尝试:#如果主文件已经存在,打开并附加fo文件,如果路径。exists(masterFile) == True: #创建CSV写入器打开(masterFile, 'ab')作为csvfile: writer = CSV。writer(csvfile, delimiter=",", quotechar="'",引号=csv. quote_minimum) #如果翻译状态成功,如果fme写入所有翻译属性。status == True: writer。writerow ([dateToday、timeNow fme基金。地位,fme基金。failureMessage fme基金。elapsedRunTime fme基金。totalFeaturesRead fme基金。如果翻译状态不成功,只写状态和失败消息,否则:作者。writerow ([dateToday、timeNow fme基金。地位,fme基金。failureMessage,'','','','']) # If master file does not exist, open and write to file else: with open(masterFile, 'wb') as csvfile: # Create CSV writer writer = csv.writer(csvfile, delimiter=",", quotechar="'" , quoting=csv.QUOTE_MINIMAL) # Write header row writer.writerow(['Date', 'Time', 'TranslationStatus', 'FailureMessage', 'TranslationTime', 'TotalFeaturesRead', 'TotalFeaturesWritten', 'LogFileName']) # If translation status is successful, write all translation attributes if fme.status == True: writer.writerow([dateToday, timeNow, fme.status, fme.failureMessage, fme.elapsedRunTime, fme.totalFeaturesRead, fme.totalFeaturesWritten, fme.logFileName]) # If translation status is not successful, write status and failure message only else: writer.writerow([dateToday, timeNow, fme.status, fme.failureMessage,'','','','']) except Exception as e: print("WRITE TO TRANSLATION HISTORY FAILED") print("Error: ", e)
为简单起见,翻译历史日志将在同一文件夹作为工作区中创建并具有相同的名称为工作区。该脚本使用fme.macroValues []字典,以获取包含工作区的文件夹的路径以及带有宏(预定义参数)的工作区的名称“FME_MF_DIR”和“WORKSPACE_NAME”创建翻译历史文件的文件路径。
实际的创作,写/ CSV文件中追加由嵌套控制如果别的语句。第一个如果别的检查翻译历史文件是否存在path.exists ()。如果工作区还没有运行之前,将不会有翻译历史记录(path.exists ()将假)。该CSV日志将与内置Python函数打开使用打开()以二进制写(“白平衡”)模式。
然后,该脚本会写两行:第一,标题行,因为此行会不存在,二是包含翻译信息列。翻译细节写有全局变量,如被访问fme.elapsedRunTime,fme.totalFeaturesWritten,fme.totalFeaturesRead等。的完整列表FME功能和可用于Python关机脚本变量,请参阅FME_END_PYTHON在下面的文档部分。
如果之前已经运行了工作区,那么转换历史文件将已经存在追加二进制模式(“ab“)来代替。将追加写入到文件的末尾,这意味着以前的行不会被覆盖并丢失。此外,它是没有意义的写另一个标题行的文件,因为一个已经存在,所以才有了翻译详细信息行需要被写入。
第二如果别的语句检查与翻译状态fme.status变量。记住,如果一个翻译失败了,只fme.status和fme.failureMessage保证包含有效值。为了避免无效值的潜在问题,如果fme.status不是真正(即转换失败),那么只有日期,时间,翻译状态和故障信息将被写入。
运行工作空间,进入“否”的翻译终止参数,然后输入要写入输出的位置。特性通过通过测试端口。工作空间完成后,转到保存工作空间的文件夹。您应该看到一个与工作区的名称相同的CSV文件(ShutdownPython3.csv在这个例子中)。打开文件。应该有两行:头和包含刚刚完成翻译细节的行。关闭CSV文件。
如何在工作区成功运行后的翻译历史记录出现。
返回到工作区。再次运行工作空间,但选择“是”的翻译终止参数。这一次,作为特征通过翻译出现故障,由于终结者失败测试端口。
通过引导功能终结者变压器强制转换失败。
打开翻译历史文件。应该有第三行,其中只包含日期、时间、翻译状态和失败消息。
翻译历史日志的最后一行应该在失败的转换后只包含四个值。
现在,您可以通过工作台运行具有.bat文件工作区(或你的操作系统等价物),任务调度,甚至是手动,并让每个翻译工作区的记录在一个易于搜索的文件。
对于更复杂的关机Python示例请参阅文章:
要在Workbench中访问启动和关闭脚本的帮助,请从菜单栏中打开帮助,并在搜索栏中输入关键字“Python”并选择适当的条目,或转到:
有关可用于关闭Python脚本的FME变量和函数的完整列表,请转到:FME_END_PYTHON
你可以找到的Python FME的完整文档对象这里API:FME对象Python API
这里使用的数据来源于由温哥华的城市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
©2020安全亚搏在线软件公司|法律