Script Python de lancement et de fermeture

Paramètre de traitement  > Scriptage  > Script Python de lancement, Script de fermeture Python.

Ces paramètres permettent à l'utilisateur de spécifier un script Python qui sera exécuté avant ou après un traitement.

Il y a de nombreuses raisons d'utiliser de tels scripts :

  • La vérification d'une connexion à une base de données avant de lancer un traitement.
  • Le déplacement de données avant ou après un traitement.
  • Le scan du log pour un message particulier ou une condition.
  • L'écriture de résultats d'un traitement dans un log personnalisé, dans une table de base de données ou dans un e-mail destiné à un administrateur.

Dépendances

Spécifier un interpréteur Python

L'interpréteur Python utilisé par FME pour exécuter des scripts Python est contrôlé par le paramètre de traitement Compatibilité Python et le paramètre Interpréteur Python préféré dans le menu Outils > Options FME > Traitement.

Installer Python

Consulter la section Installer des packages Python dans FME Form.

Script Python de lancement

Un script de lancement est exécuté avant un traitement. Ce script peut lire tous les paramètres publiés et écrire dans le fichier de log.

Note: Consulter le lien suivant FME_BEGIN_PYTHON pour obtenir une liste globale des variables disponibles.

Une exception non gérée déclenchée par un script de démarrage entraîne l'abandon de la traduction.

Cet exemple de script de démarrage vérifie que l'interpréteur Python a la version requise pour une traduction. Si ce n'est pas le cas, le traitement est interrompu avant toute lecture de données. Il s'agit d'un bon exemple du type de vérification avant traitement pour lequel un script de lancement est utile.

import sys
 
# Raises an exception if the Python interpreter is not version 3.5 or higher.
def python_version_check():
if sys.version_info <= (3,5):
raise Exception("Python version 3.5+ required to run workspace")
 
# Appeler la fonction FME à exécuter.
python_version_check()

Script Python de fermeture

Un script de fermeture est exécuté à la fin d'un traitement. Ce script a accès à un certain nombre de variables globales Python qui contiennent des statistiques, les valeurs des paramètres publiés et d'autres informations sur la traduction.

Note: Consulter le lien suivant FME_END_PYTHON pour obtenir une liste globale des variables disponibles.

Un script d'arrêt ne doit pas utiliser de modules de l'API Python de FME Objects. Pendant l'arrêt, les ressources requises par FME Objects ne sont plus disponibles et les appels à l'API auront des résultats imprévisibles.

Cet exemple de script d'arrêt montre comment envoyer un e-mail de notification en cas d'échec du traitement. Le fichier de log sera joint à l'e-mail.

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os
 
# Variables  FME
import fme
status = fme.status
errorMsg = fme.failureMessage
logFile = fme.logFileName
 
# valeurs d'un e-mail
subject = "FME Translation FAILURE"
to = "receiver@domain.com"
sender = "Your FME script <sender@domain.com>"
text = "FME translation failed with error message: " + errorMsg + \
"\r\n\r\nSee attached logfile for details."

 

# Authentification
AUTHREQUIRED = 0
username = "smtp.user@domain.com"
password = "smtppassword"
smtpServer = "smtp.server.com"

 

#  Créer et renvoyer un message avec un fichier de log en pièce jointe
def createMessage():
# Configurer l'email
message = MIMEMultipart()
message["Subject"] = subject
message["To"] = to
message["From"] = sender
message["Date"] = formatdate(localtime=True)
message.attach(MIMEText(text))
 
# Mettre le fichier de log en pièce jointe
attachment = MIMEBase("application", "octet-stream")
attachment.set_payload(open(logFile, "rb").read())
Encoders.encode_base64(attachment)
attachment.add_header("Content-Disposition",
'attachment; filename="%s"' % os.path.basename(logFile))
message.attach(attachment)
return message
 
#  Envoyer le message
def sendMessage(message):
server = smtplib.SMTP(smtpServer)
if AUTHREQUIRED:
server.login(username, password)
server.sendmail(sender, to, message.as_string())
server.quit()
 
# E-mailer les résultats d'échec de la conversion
def mailResults():
if status == 0:
message = createMessage()
sendMessage(message)
 
# Appeler la fonction FME à exécuter.
mailResults()