西班牙
斯潘4
本文是由5部分组成的系列文章的第5部分,帮助您开始使用基本的Python和FME。本文介绍如何在Workbench中使用shutdown Python脚本功能,并包括使用shutdown Python脚本通过电子邮件发送翻译统计信息、使用文件格式的默认应用程序打开输出数据集以及写入翻译历史日志的示例。
可以将Python脚本添加到工作区中,该工作区将在工作区完成时运行。例如,您可能希望在工作区完成时将文件复制到某个位置,或者使用非数据检查器的应用程序打开输出数据集。
在成功转换中关闭所有转换器、读取器、写入程序和日志文件后,将运行关闭脚本。如果翻译失败,脚本仍将执行,但可能失败fme.status和fme.failureMessage保证包含有效值。
如帮助页中所述启动和关闭脚本,不建议将FME对象Python API中的任何模块与关闭脚本一起使用,因为FME对象所需的资源不再可用,因此对API的调用将产生不可预测的结果。
但是,您可以像在启动脚本、脚本化参数和PythonCaller中一样使用fme.macroValues []字典。shutdown Python脚本还可以访问FME创建的一些全局变量,例如fme.featuresRead,fme.featuresWritten还有更多。此外,脚本可以访问在启动Python脚本中设置的任何全局Python变量。有关全局变量的完整列表,请参见主题下的启动和关闭Python脚本的帮助页FME_END_PYTHON.
附加工作区:ShutdownPython1.fmw
在本例中,我们将一个shutdown Python脚本添加到一个工作区中,该工作区在工作区完成时使用Gmail发送电子邮件。如果愿意,可以编辑脚本以使用其他邮件服务器。电子邮件的主题将说明工作区是否成功,并包括编写的功能数。类似的例子也可以在帮助页上找到启动和关闭Python脚本.也可以使用写信人变压器。
打开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 Fails then Change Subject # FME_Status tells if FME was successful status = fme.status if status == 0: Subject = FailSubject Message = 'Workspace Failed' else: Message = 'Workspace Successful the following features were written: ' + FeaturesWritten # Sending the email # Using the gmail smtp server #You can edit this line to use your own email server smtpserver = smtplib.SMTP("smtp.gmail.com",587) smtpserver.ehlo() smtpserver.starttls() smtpserver.ehlo() smtpserver.login(gmail_user, gmail_pwd) header = 'To:' + to + '\n' + 'From: ' + Emailfrom + '\n' + 'Subject:' + Subject +'\n' print header msg = header + '\n' + Message + '\n\n' smtpserver.sendmail(gmail_user, to, msg) print 'done!' 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
您(或您的收件人)应当接收由关机Python脚本不久发送电子邮件。它应该是这样的,如果你选择了“否”的失败参数:
关闭脚本发送的翻译邮件成功的例子
或者,如果你选择了“是”为失败参数:
关闭脚本发送的翻译邮件失败的示例
附加工作区:ShutdownPython2.fmwt
随着工作台,用户必须重定向数据集(S)写入数据检查的选项。然而,如果用户想要与数据的默认应用程序会自动打开目标数据集是什么?停堆Python脚本可以用来这样做。
在这个例子中,我们使用关机Python脚本打开一个CSV文件翻译完成后。之所以选择这个例子CSV文件,因为它是一种文件格式,大多数用户可以打开。但是,你应该能够打开其他文件格式,使用该脚本格式的默认应用程序。
打开ShutdownPython2.fmwt.工作空间是相当简单的。它从一个CSV文件温哥华市的范围内读取单个树数据。一个AttributeManager用于删除不需要的任何属性。一个聚合器是用来寻找在附近的树木数量,并找到附近的所有树木的平均高度和直径。输出写出一个CSV文件。
ShutdownPython2工作区。fmwt which reads tree data from a CSV, aggregates the data by neighborhood and writes output in CSV format.
关机脚本用于打开你的计算机上的默认应用程序集的输出CSV文件。在导航窗格中,去工作区参数>脚本>关闭Python脚本查看脚本或复制以下它,如果你要创建一个拥有自己的数据的工作区。
导入子流程,fme,Windows 64位上常见CSV默认应用程序的sys#路径#r“C:\程序文件(x86)\ Microsoft Office\Office15\EXCEL.exe”#r“C:\程序文件(x86)\记事本++\记事本++.exe”r“C:\ Windows\System32\Notepad.exe”#使用FME的宏值字典获取输出的目录位置dir=FME.macro values['DestDataset\u CSV2'];使用获取输出文件名output name的FME宏值字典=FME.macro values['csv_file_name']#追加目录和文件名以获取输出文件的文件路径output path='{}\{}.{}'。格式(outputDir,outputName,“csv”)#用于调试打印(output path)的打印函数#使用子流程模块打开默认应用程序的输出文件尝试:#若要使用shell=False,应指定默认应用程序的完整文件路径,然后output file#取消下面一行的注释,添加适用的文件路径,并注释掉包含shell=True的行。#P=子流程.Popen([“”、“ , shell=False) P =子进程。Popen([outputPath], shell=True) print("Output CSV file successfully opened") except Exception as e: print("SHUTDOWN SCRIPT FAILED.错误:” E)
剧本比较简单。使用子流程以及fme模块中,脚本将查找并创建包含输出数据集的文件路径的变量。此变量与子流程模块的Popen构造函数,用于创建子进程,该子进程使用格式的默认应用程序打开输出数据集。
使用了Popen构造函数而不是subprocess.call ()因为叫()将使用与翻译引擎(FME.exe)相同的过程,这意味着在用户关闭用于打开输出数据集的应用程序之前,翻译不会完成。作为Popen ()构造函数创建一个子进程,FME.exe可以在转换后关闭,并且在关闭打开的应用程序之前工作区不会挂起。
重要提示:使用shell = True论证Popen通常不建议使用构造函数,因为这会使程序容易受到外壳注入的攻击,如果与不受信任的输入相结合,则可能会造成安全隐患。有关更多信息,请参见此处的官方Python文档:Python Popen构造函数.这个shell = True参数的使用是为了简单起见,因为它不需要指定应用程序路径。在这种情况下,由于工作区用户负责命令的输入,因此它带来的安全隐患较小。然而,使用它的风险自负.
如果你想使用shell = False作为参数,取消注释以下行:
P=子流程.Popen([“”、“ “],壳= FALSE)
替换
确保运行提示已启用并运行工作区。输入参数或保留为默认值。6个特性应写入输出CSV文件。设置为计算机上CSV文件格式默认值的应用程序应自动启动,并且您应能够查看和编辑输出CSV文件。
翻译日志窗格中的消息,说明输出CSV文件已成功打开。如果无法打开CSV文件,则会出现错误消息。
Gif演示关闭Python脚本的行为。注意,当工作空间完成时,Microsoft Excel打开输出CSV文件。
附加工作区:ShutdownPython3.fmw
如果工作区多次运行或按计划运行,用户如何跟踪翻译(例如:如下所示批处理方法1:命令行或批处理文件文章)?当然,如果在Workbench中选择了“附加到日志”选项,则可以查看日志文件(查看这里的日志文档)或者指定了要在批处理文件中创建的日志历史记录。但另一个选项是使用关闭Python脚本为特定工作区创建翻译历史日志。
在本例中,关闭脚本将创建CSV日志或将其附加到CSV日志中,其中包含用户可能感兴趣的属性,如翻译状态、翻译日期和时间、读取或写入的功能、翻译所用的时间等。为此,脚本利用了fme模块的全局变量。
打开附加的工作区(ShutdownPython3.fmw-请参阅上面的下载部分)。工作区非常简单,包含Sentinel2阅读器、测试仪、GeoTIFF编写器和终结者。此工作区将检索符合读者标准的最新图像,并将图像作为GeoTIFF光栅写出。
一个非常简单的工作空间,演示了如何使用shutdown 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'。format(workspacePath, workspaceName) try: # If master file already exists, open and append fo file if path.exists(masterFile) == True: # Create CSV writer with open(masterFile, 'ab') as csvfile: writer = csv.writer(csvfile, delimiter=",", quotechar="'" , quoting=csv.QUOTE_MINIMAL) # 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,'','','','']) # 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 ()将假).的内置Python函数open()将打开csv日志用二进制(“白平衡”)模式。
然后脚本将写入两行:首先是标题行,因为这一行不存在,然后是包含翻译细节的行。写入的翻译细节通过全局变量进行访问,例如fme.elapsedRunTime,fme.totalFeaturesWritten,fme.totalFeaturesRead等。的完整列表fme对于Python关闭脚本可用的函数和变量,请参阅下面的文档部分中的FME_END_PYTHON。
如果之前已经运行了工作区,那么转换历史文件将已经存在附加在二进制模式(“ab)被替换。追加将写入文件的末尾,这意味着先前的行不会被覆盖和丢失。此外,将另一个标题行写入文件没有意义,因为已经存在一个标题行,所以只需要写入翻译细节行。
第二个如果/其他语句检查翻译状态fme.status变量。记住,如果一个翻译失败了,只fme.status和fme.failureMessage保证包含有效值。为了避免无效值的潜在问题,如果fme.status不是真正的(即。翻译失败),然后只会写入日期、时间、翻译状态和失败消息。
运行工作区,输入“No”终止翻译参数,然后输入要写入输出的位置。特性通过通过了测试端口。工作空间完成后,转到保存工作空间的文件夹。您应该看到一个与工作区的名称相同的CSV文件(ShutdownPython3.csv对于这个例子)。打开文件。应该有两行:header和包含刚刚完成的转换的详细信息的行。关闭CSV文件。
翻译历史日志在工作空间成功运行后如何显示。
回到工作区。再次运行工作区,但是选择“Yes”终止翻译参数。这一次,翻译应该失败,因为终止符的特征通过失败的测试端口。
通过将特征指向终止符变压器来强制转换失败.
打开翻译历史文件。第三行应该只包含日期、时间、翻译状态和失败消息。
翻译历史日志的最后一行应该只包含翻译失败后的四个值。
您现在可以使用.bat文件(或您的操作系统等效文件)、任务调度程序,甚至可以通过Workbench手动运行您的工作空间,并在一个易于搜索的文件中记录工作空间的每个转换。
有关更复杂的关闭Python示例,请参阅文章:
要在Workbench中访问启动和关闭脚本的帮助,请从菜单栏中打开帮助,并在搜索栏中输入关键字“Python”并选择适当的条目,或转到:
有关可用于关闭Python脚本的FME变量和函数的完整列表,请转到:FME_END_PYTHON
你可以在这里找到Python FME Objects API的完整文档:FME对象Python API
这里使用的数据来源于由温哥华的城市不列颠哥伦比亚省。它包含在开放政府许可下的信息-温哥华。
?2019安全亚搏在线软件公司|合法的