Ich habe eine großartige Schnittstelle zu FME mit Python gesehen
Was macht ihr damit? Ich möchte Ideen.
Ich habe eine großartige Schnittstelle zu FME mit Python gesehen
Was macht ihr damit? Ich möchte Ideen.
Antworten:
Ich fange gerade erst mit FME an und verwende ein Shutdown-Skript, um meine Ziel-REA an einen anderen Speicherort zu kopieren und die Protokolldatei zu speichern:
import distutils.dir_util, shutil, os, time, locale
src = 'C:/Testing/FME/TPW/Third_Party_Wells.gdb'
dst = '//share/Data Services/GIS Data/Data/Third Party Wells/Third_Party_Wells.gdb'
distutils.dir_util.copy_tree(src, dst)
logfile = FME_LogFileName
shutil.copy(logfile, 'C:/temp/PRD_' + os.path.basename(logfile)[:-4] + '_' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime()) + '.log')
# Get features written counts
shl_count = str(FME_FeaturesWritten['ThirdPartyWellsSurface'])
bhl_count = str(FME_FeaturesWritten['ThirdPartyWellsBottom'])
lat_count = str(FME_FeaturesWritten['ThirdPartyWellsLaterals'])
# Write out features written counts to log
fm_log = open('C:/temp/PRD_Counts.log','a')
fm_log.write(time.strftime('%m/%d/%Y %I:%M:%S', time.localtime()) + ',' + shl_count + ',' + bhl_count + ',' + lat_count + ',' + str(FME_TotalFeaturesWritten) + '\n')
Das ist ziemlich einfach, aber ich glaube, es gibt wirklich keine Grenzen. Auch hier gibt es jede Menge Ideen .
BEARBEITEN: Im Code hinzugefügt, um die Anzahl der geschriebenen Funktionen abzurufen und diese in die CSV-Protokolldatei zu übertragen.
Schauen Sie sich Olivers Python Corner an. Es gibt eine Menge Dinge, die Sie mit Python in FME tun können.
Ich benutze oft den PythonCaller, um einige Attributmanipulationen innerhalb eines Transformators durchzuführen, anstatt 10 verschiedene Transformatoren zu verwenden (wenn elif elif sonst ..)
Sie können sehr einfache PythonCaller wie dieses Beispiel haben, die alle Ihre Attribute in Großbuchstaben konvertieren:
def upperAll(feature):
for att in feature.getAttributeList():
feature.setAttribute(att,feature.gettAttribute(att).upper())
Ich benutze den PythonCaller auch, um im Fehlerfall E-Mails zu senden oder mit einem FTP-Server usw. zu interagieren. Es gibt wirklich keine Grenzen
Viel Spaß und viel Spaß beim FMEing
Jeff
Gutes Beispiel oben: Ich schreibe gerade einen Artikel für unsere Wissensdatenbank namens FMEPedia hier: Python- und FME-Grundlagen .
Dies umfasst einige einfache Beispiele wie das Löschen einer Datei vor dem Ausführen eines Arbeitsbereichs mit einem Startskript, das Bearbeiten von Funktionen mit einem PythonCaller usw. Es gibt auch Links zu komplexeren Beispielen.
Ken Bragg Sichere Software
Beispiele:
Benutzerdefiniertes Protokoll
import os.path, time, os, datetime, __main__ , sys, pyfme,shutil
from pyfme import *
class expFeature(object):
def __init__(self):
self.logger = pyfme.FMELogfile()
pass
def close(self):
try:
#folders creation
os.makedirs(param_folder)
#Log creation
logFile = param_folder + timecreated +".log"
FILE = open(logFile,"w")
log=FMELogfile(logFile)
log.log("Bla bla bla")
Und E-Mail senden :
message = MIMEMultipart()
message["From"] = email_from
message["To"] = email_to
message['Date'] = formatdate(localtime=True)
message["Subject"] = subject
message.attach( MIMEText(html, 'html') )
attachment = MIMEBase('application', "octet-stream")
attachment.set_payload( open(FileLog,"rb").read() )
Encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(FileLog))
message.attach(attachment)
smtp = smtplib.SMTP(smtpServer)
smtp.sendmail(email_from, email_to, message.as_string())
print "Successfully sent email"
smtp.close()
Ich habe kürzlich einen PythonCaller-Transformator verwendet, der Koordinaten aus einer CSV-Datei abruft und als Attribute speichert. Die CSV wird aus einem anderen Arbeitsbereich geschrieben, der einen BoundsExtractor Transformer verwendet, der die Begrenzungskoordinaten aus einem Begrenzungsrahmen meines Interessenbereichs abruft.
Ich übergebe diese Attribute dann an andere WorkspaceRunner, die die Begrenzungskoordinaten als Suchfenster für die weitere Verarbeitung verwenden. Ich habe landesweite Daten und die Verarbeitung des gesamten Staates würde mehrere Stunden dauern. Da ich meine Verarbeitung auf ein bestimmtes Fenster beschränke, dauert das Ganze eine Minute.
Der pythonCaller-Code ist hier:
import fmeobjects
import csv
import re
# Template Function interface:
def getBounds(feature):
outputDirectory = FME_MacroValues['Output_Directory'] # Set outputDirectory
NativeTitle = FME_MacroValues['Native_Title'] # Set NativeTitle
NativeTitle = re.sub('\W','_',NativeTitle)
NativeTitle = re.sub(' ','_',NativeTitle)
csvPath = outputDirectory + '\\' + NativeTitle + '_boundingbox.csv' # Set csvPath
# open csv file containing bounding coordinates
with open(csvPath, 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter = ',')
bounds = reader.next()
# Set bounding variables
XMIN = float(bounds[0])
XMAX = float(bounds[1])
YMIN = float(bounds[2])
YMAX = float(bounds[3])
# Set attributes to variable values
feature.setAttribute("_xmin", XMIN)
feature.setAttribute("_ymin", YMIN)
feature.setAttribute("_xmax", XMAX)
feature.setAttribute("_ymax", YMAX)
pass
Ich verwende auch ein Python-Startskript, das einen Ordnerbaum an einen anderen Speicherort kopiert, falls er noch nicht vorhanden ist.
import os
import fmeobjects
import shutil
srcDir_project = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\ProjectNameFolder'
srcDir_settings = r'W:\AlignmentSheets\PostInstall\Alignment Sheet Generator\ProjectData\Settings'
destBaseDir = FME_MacroValues['Output_Directory']
destDir_project = destBaseDir + '\\' + FME_MacroValues['A_Sheet_Project_Name'] + '\\'
destDir_settings = destBaseDir + '\\Settings\\'
if not os.path.exists(destDir_project):
shutil.copytree(srcDir_project,destDir_project)
print 'Successfully created "%s"' % destDir_project
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_project
if not os.path.exists(destDir_settings):
shutil.copytree(srcDir_settings,destDir_settings)
print 'Successfully created "%s"' % destDir_settings
else:
print '"%s" Already Exists. Not Creating Folder.' % destDir_settings