Wer nutzt die FME Python-Erweiterung und wie?

10

Ich habe eine großartige Schnittstelle zu FME mit Python gesehen

Was macht ihr damit? Ich möchte Ideen.

Philippe Lavoie
quelle

Antworten:

9

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.

Chad Cooper
quelle
5

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

Jaykayone
quelle
Oooohhhhh ... Ich mag den Sound davon ... habe nie darüber nachgedacht, einen PythonCaller so zu verwenden!
Chad Cooper
Zusätzliche Frage zu diesem Thema ... Welches Programm müssen Sie auf Port 25 (Firewall) zugreifen, damit die E-Mail funktioniert? Ich hatte ein paar Wochen damit zu kämpfen und gab dann endlich auf.
Blord-Castillo
4

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

Ken Bragg
quelle
3

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() 
Benutzer3120
quelle
1

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
Fezter
quelle