西班牙
斯潘4
本文是由5部分组成的系列文章的第5部分,帮助您开始使用基本的python和fme。本文介绍如何在Workbench中使用Shutdown Python脚本功能,并包括使用Shutdown Python脚本通过电子邮件发送翻译统计信息、使用文件格式的默认应用程序打开输出数据集以及写入翻译历史日志的示例。
可以将python脚本添加到工作区中,该工作区将在工作区完成时运行。例如,您可能希望在工作区完成时将文件复制到某个位置,或者使用非数据检查器的应用程序打开输出数据集。
在成功转换中关闭所有转换器、读取器、写入程序和日志文件后,将运行关闭脚本。如果翻译失败,脚本仍将执行,但可能失败口蹄疫.状态和故障信息保证包含有效值。
如帮助页中所述启动和关闭脚本,不建议将fme对象python api中的任何模块与关闭脚本一起使用,因为fme对象所需的资源不再可用,因此对api的调用将产生不可预测的结果。
但是,您可以像在启动脚本、脚本化参数和pythoncaller中一样使用fme.宏值[]字典。shutdown python脚本还可以访问fme创建的一些全局变量,例如功能广告,请fme.功能编写,还有更多。此外,脚本可以访问在启动python脚本中设置的任何全局python变量。有关全局变量的完整列表,请参见主题下的启动和关闭python脚本的帮助页巨蟒是的。
附加工作区:shutdownpython1.fmw
在本例中,我们将一个shutdown python脚本添加到一个工作区中,该工作区在工作区完成时使用gmail发送电子邮件。如果愿意,可以编辑脚本以使用其他邮件服务器。电子邮件的主题将说明工作区是否成功,并包括编写的功能数。类似的例子也可以在帮助页上找到启动和关闭python脚本是的。也可以使用寄信人变压器。
打开关闭python1工作区(请参阅上面的下载部分)和导航器窗格中的工作区参数>脚本,您将看到一个名为关闭python脚本是的。在这里,您可以输入或查看下面的python代码,该代码将使用gmail帐户发送电子邮件。
导航器窗格中shutdown python脚本参数的位置
脚本导入smtplib软件和口蹄疫模块,分别提供电子邮件工具和FME字典的访问权限。下一节检索用户设置的fme参数。然后脚本获取写入的特征数并将其转换为文本。如果/其他语句根据翻译成功还是失败来确定要使用的消息文本。最后一节介绍如何使用gmail smtp服务器发送电子邮件。
#smtplib为我们提供了电子邮件工具import smtplib,fme获取工作区运行时设置的fme参数值=fme.macrovalues['emailto']gmail_user=fme.macrovalues['gmailuser']gmail_pwd=fme.macrovalues['password']subject=fme.macrovalues['successsubject']failsubject=fme.macrovalues['failsubject']emailfrom=fme.macrovalues['emailfrom']获取fme编写的功能数featureswrited=str(fme.featureswrited)如果fme失败,则更改主题fme_u status告诉fme是否成功status=fme.status如果status==0:subject=failsubject message='workspace failed'否则:message='workspace successful写入了以下功能:'+featureswrited使用gmail smtp发送电子邮件服务器您可以编辑这一行,使用自己的电子邮件服务器smtp server=smtplib.smtp(“smtp.gmail.com”,587)smtpserver.ehlo()smtpserver.starttls()smtpserver.ehlo()smtpserver.login(gmail嫒u user,gmail_pwd)header='到:'+到+'\n'+'从:'+emailfrom+'\n'+'主题:'+subject+'\n'打印头msg=header+'\n'+message+'\n\n'smtpserver.sendmail(gmail_user,to,msg)打印'完成!'smtpserver.close()
有两个要点需要注意:
答。我们正在使用fme.宏值[]字典的方式与startup python script和scripted parameters文章中的示例相同。例如,可以在运行工作区时设置gmail用户名,并通过发布的参数进行访问,如下所示:fme.macrovalues['gmailuser']是的。
乙。其次,注意我们使用了两个全局变量口蹄疫模块:fme.功能编写它是按功能类型索引的python字典,并且FME状态这是一个布尔值,告诉我们工作区是成功还是失败。
使用运行工作区文件>提示运行或者选择“提示并运行”按钮,然后选择“运行”按钮。将出现“转换参数”对话框。填写适当的参数。您需要自己的gmail帐户用户名(email address)**和密码,以及与用户名相同的发件人电子邮件地址。此外,请填写收件人电子邮件地址(可以与发件人电子邮件地址相同)和失败和成功的主题行。在附加的示例工作区中,fail参数用于通过向终结器转换器发送特性来模拟工作区故障。单击“确定”发送。
**注:如果您的Gmail帐户启用了双因素身份验证,则可能需要生成与Gmail帐户关联的应用程序密码。登录到你的gmail帐户,你会在“我的帐户>登录和安全”下找到一个生成应用密码的页面。生成应用程序密码后,请在运行工作区时输入该应用程序密码作为密码。如果使用普通密码,python脚本可能无法执行,并显示消息“用户名和密码不被接受”。
有关使用Gmail时的身份验证问题的详细信息,请参阅以下两篇知识中心文章:
关闭python1.fmw的“转换参数”对话框
您(或您的收件人)很快就会收到shutdown python脚本发送的电子邮件。如果为fail参数选择“no”,则应该如下所示:
关闭脚本发送的成功翻译电子邮件示例
或者,如果选择“是”作为失败参数:
关闭脚本发送的翻译失败电子邮件示例
附加工作区:shutdownpython2.fmwt
使用Workbench,用户可以选择将写入数据检查器的数据集重定向。但是,如果用户希望使用数据的默认应用程序自动打开目标数据集,该怎么办?可以使用关闭python脚本来执行此操作。
在本例中,我们使用关闭python脚本在翻译完成后打开csv文件。本例选择了csv文件,因为它是大多数用户都可以打开的文件格式。但是您应该能够使用此脚本使用该格式的默认应用程序打开其他文件格式。
正常开放关闭python2.fmwt是的。工作空间非常简单。它从一个csv文件中读取温哥华市的单个树数据。一个属性管理器用于删除不需要的任何属性。一个聚合器用于查找一个邻居中的树数,并查找一个邻居中所有树的平均高度和直径。输出将作为csv文件输出。
shutdownpython2.fmwt的工作区,它从csv读取树数据,按邻域聚合数据,并以csv格式写入输出。
shutdown脚本用于打开计算机上设置了默认应用程序的输出csv文件。在“导航器”窗格中,转到工作区参数>脚本>关闭python脚本如果要使用自己的数据创建工作区,请在下面查看或复制脚本。
进口子,FME,SYS#在Windows 64位# - [R共同CSV默认应用程序的路径 “C:\ Program Files文件(x86)的\的Microsoft Office \ Office15 \ EXCEL.EXE” #R“C:\ Program Files文件(86)\Notepad++\notepad++.exe" r”C:\Windows\System32\notepad.exe” # Use FME's macro values dictionary to get directory location of output outputDir = fme.macroValues['DestDataset_CSV2'] # Use FME's macro values dictionary to get output file name outputName = fme.macroValues['csv_file_name'] # Append directory and file name to get file path of output file outputPath = '{}\\{}.{}'.format(outputDir, outputName, 'csv') # Print functions for debugging #print(outputPath) # Use subprocess module to open output file with default application try: # To use shell=False, you should specify the full file path of the default application and outputfile # Uncomment the line below, add your applicable file paths, and comment out the line containing shell=True.#P = subprocess.Popen([”“,” “],shell=false)p=subprocess.popen([outputpath],shell=true)print(“output csv file successfully opened”)除了e:print(“shutdown script failed”异常。错误:“,e)
该脚本是相对比较简单。使用子流程和口蹄疫模块,所述脚本发现并创建包含输出数据集的文件路径的变量。此变量用于与子流程模块的POPEN构造函数来创建其打开带有格式的默认应用程序的输出数据集的一个子进程。
器一起构造使用的,而不是子流程.调用()因为呼叫()将使用相同的过程,作为翻译引擎(FME.exe),这意味着你的翻译将无法完成,直到用户关闭它是用来打开输出数据集的应用程序。由于波本()构造函数创建一个子进程,FME.exe后可以翻译和工作空间不会挂起,直到打开的应用程序被关闭关闭。
重要提示: 使用外壳=真争论的波本一般不推荐的构造因为这使得容易受到壳注射程序,并且可以是一个安全危险如果与不可信的输入组合。欲了解更多信息,请参阅此处Python官方文档:python popen构造函数是的。该外壳=真参数被用于简单,因为它不要求指定应用程序的路径。在这种情况下,由于工作空间用户负责输入的命令,它具有较小安全危险的。然而,使用它的风险由你自己承担是的。
如果您希望使用外壳=假作为参数,去掉下面行的:
P = subprocess.Popen([”“,” “],shell=false)
更换
确保在提示下运行启用和运行工作区。输入您的参数或保留为默认值。6个特性应写入到输出CSV文件。设置为默认的CSV文件格式,你的机器上的应用程序应自动启动,你应该能够查看和编辑输出CSV文件。
翻译日志窗格中的消息,表示已成功打开输出CSV文件。如果无法打开csv文件,则会显示一条错误消息。
演示关闭python脚本的行为的gif。请注意,当工作区完成时,Microsoft Excel将打开输出CSV文件。
附加工作区:shutdownpython3.fmw
用户如何可以跟踪翻译如果一个工作空间上的时间表多次运行或(例如:如本批处理方法1:命令行或批处理文件文章)?当然,你可以通过看日志文件,如果“附加到日志”选项内选择工作台在(有关日志文档,请参见此处),或者如果你指定了日志历史记录您的批处理文件中创建。但另一种选择是创建一个翻译历史记录与关闭Python脚本一个特定的工作区。
在这个例子中,关机脚本将创建或追加到CSV记录与属性,用户可能感兴趣的诸如翻译状态,翻译日期和时间,功能读取或写入,翻译了多长时间,等等。要做到这一点,脚本需要一系列的优势口蹄疫模块的全局变量。
打开附加工作区(关闭python3.fmw- 请参见上面下载部分)。工作区是含有Sentinel2阅读器,测试仪,的GeoTIFF作家非常简单,和终结。此工作区将检索最新的图像匹配读者的标准和写出来的图像作为的GeoTIFF栅格(S)。
一个非常简单的工作区,演示如何使用关闭python脚本创建翻译历史日志。
在下面的导航窗格工作区参数>脚本,您将看到一个名为关闭python脚本是的。双击打开脚本编辑器窗口。如果您要创建自己的工作区,复制并粘贴Python代码下面这将创建一个翻译的历史记录或追加转换的详细信息。
#导入模块导入FME,CSV,日期时间从OS导入路径#获取当前日期和时间dateToday = datetime.date.today()。strftime的( '%Y /%米/%d')timeNow = datetime.datetime.now()。time().strftime('%H.%M.%S') # Get workspace's directory path # Replace backward slashes with forward slashes to avoid escape character issues workspacePath = fme.macroValues['FME_MF_DIR'] workspacePath = workspacePath.replace('\\','/') # Get workspace name workspaceName = fme.macroValues['WORKSPACE_NAME'] # Create file path for master file 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.宏值[]字典,以获得含有所述工作区和工作区名称与宏(预定义的参数)的文件夹的路径'fme_mf_目录'和'工作区名称'以创建翻译历史文件的文件路径。
实际的创作,写/ CSV文件中追加由嵌套控制如果/其他声明。首先如果/其他检查翻译历史文件是否存在用存在性()是的。如果工作区还没有运行之前,将不会有翻译历史记录(存在性()将会假)。该CSV日志将与内置Python函数打开使用打开()二进制写入('WB')模式。
然后,该脚本会写两行:第一,标题行,因为此行会不存在,二是包含翻译信息列。翻译细节写有全局变量,如被访问埃拉普塞德朗蒂姆,请fme.totalfeatureswrited,请FME.总功能读取等等。有关完整列表口蹄疫功能和可用于Python关机脚本变量,请参阅FME_END_PYTHON在下面的文档部分。
如果工作区之前已运行,翻译历史文件就已经存在,因此二进制追加模式(“AB公司“)来代替。将追加写入到文件的末尾,这意味着以前的行不会被覆盖并丢失。此外,它是没有意义的写另一个标题行的文件,因为一个已经存在,所以才有了翻译详细信息行需要被写入。
第二如果/其他声明检查与翻译状态FME状态变量。请记住,如果转换失败,只FME状态和故障信息保证包含有效值。为了避免无效值的潜在问题,如果FME状态不是真的(即。翻译失败),那么只有日期,时间,翻译状态和故障信息将被写入。
运行工作空间,进入“否”的终止翻译参数,并输入要写入的输出。该功能通过通过测试端口。工作区完成后,转到工作区保存的文件夹。您应该看到相同名称的CSV文件作为工作区(关闭python3.csv在这个例子中)。打开文件。应该有两行:头和包含刚刚完成翻译细节的行。关闭CSV文件。
工作区成功运行后翻译历史记录的显示方式。
返回到工作区。再次运行工作空间,但选择“是”的终止翻译参数。这一次,作为特征通过翻译出现故障,由于终结者失败测试端口。
通过将功能定向到终结器转换器来强制转换失败是的。
打开翻译历史文件。应该有第三排只包含日期,时间,翻译状态和故障信息。
翻译失败后,翻译历史记录日志的最后一行应仅包含四个值。
现在,您可以使用.bat文件(或您的操作系统等效文件)、任务调度程序运行工作区,甚至可以通过Workbench手动运行,并在一个易于搜索的文件中记录工作区的每个转换。
有关更复杂的关闭python示例,请参阅以下文章:
要访问Workbench中启动和关闭脚本的帮助,请从菜单栏打开“帮助”,在搜索栏中输入关键字“python”,然后选择适当的条目,或转到:
有关可用于关闭python脚本的fme变量和函数的完整列表,请转到:巨蟒
您可以在这里找到python fme objects api的完整文档:fme对象python api
此处使用的数据源于温哥华市,不列颠哥伦比亚省。它包含根据开放的政府许可证-温哥华许可的信息。
?2019安全亚搏在线软件公司|合法的