Zurück zum Inhaltsverzeichnis - Lösungen und Tipps
- ms.tru
Für verschiedene Aufgaben ist es notwendig oder sinnvoll, externe Werkzeuge von TUSTEP (hier TUSCRIPT) aus aufrufen zu können. Mit der parametrisierbaren Makroanweisung EXECUTE ist dies möglich.
Anhand einer beispielhaften Aufgabe, der Berechnung des dekadischen Logarithmus, wird die Verwendung vorgestellt.
Die hier gezeigten Beispiele wurden nur unter Windows mit installiertem Python-Interpreter getestet. Zur Ausführung müssen die korrespondierenden TUSCRIPT- und Python-Skripte im selben TUSTEP-Projektverzeichnis abgelegt werden.
Für die Berechnung des Logarithmus zur Basis 10 (=dekadischer Logarithmus) existiert in TUSCRIPT keine eigene Funktion. In anderen Programmiersprachen wie Python oder C++ ist eine solche Funktion implementiert. Im Folgenden sollen zwei unterschiedliche Verfahren gezeigt werden, um aus TUSCRIPT heraus, eine parametrisierte Berechnung anzustoßen und die extern errechneten Ergebnisse mit TUSCRIPT weiterzuverarbeiten.
log10_fi.py [1 KB]
#!/usr/local/bin/python # coding: latin-1 #python3.3 import math #Konsoleneingabe einlesen (Argument enthält Zahl, für die der Log #berechnet werden soll) import sys y, b = sys.argv #Kontrollausgabe der Kommandozeileneingabe #print (sys.argv) #wenn LOG10(Bruch) berechnen, dann Bruch aufteilen und berechnen, #sonst String-Zahl in Float konvertieren if "/" in b: b1, b2 = b.split("/") b=float(b1)/float(b2) else: b = float(b) x = math.log10(b) #print ('Log10(', b ,') = ',x) #Ausgabe des Ergebnisses in eine Protokolldatei zur Weiterverarbeitung in TUSTEP f_out = open("log10outxy.txt", "w") x = str(x) f_out.write(x) f_out.close()
Dieses Python-Skript kann von TUSCRIPT aus mittels EXECUTE aufgerufen werden:
pythex_fi.m [8 KB]
$$ MODE TUSCRIPT, {} - ### Vorverarbeitung ### - ================================ - Python-Skript zur Berechnung des dekadischen Logarithmus - ausführen. Als Argument wird exemplarisch - der zu berechnende Bruch "10/3" übergeben. - ================================ python = "log10_fi.py" ERROR/STOP OPEN (python, READ, -STD-) pfad = FULL_NAME (TUSTEP, "log10_fi.py") EXECUTE "{pfad} 10/3" - ================================ - nach Ausführung des Skriptes wird das Ergebnis aus - der Ergebnisdatei eingelesen - ================================ - Ergebnis aus Datei einlesen ERROR/STOP OPEN ("log10out.txt", READ, -STD-) log_erg = FILE ("log10out.txt") log_erg = JOIN (log_erg) PRINT "Das Ergebnis (aus Datei) lautet: ", log_erg
Ausführung:
#MA,pythex_fi.m
log10_cb.py [1 KB]
#!/usr/local/bin/python #coding: latin-1 #python3.3 import math #Konsoleneingabe einlesen (Argument enthält Zahl, für die der Log #berechnet werden soll) import sys y, b = sys.argv #Kontrollausgabe der Kommandozeileneingabe #print (sys.argv) #wenn LOG10(Bruch) berechnen, dann Bruch aufteilen und berechnen, # sonst String-Zahl in Float konvertieren if "/" in b: b1, b2 = b.split("/") b=float(b1)/float(b2) else: b = float(b) x = math.log10(b) print ('Log10(', b, ') = ',x) #Ausgabe des Ergebnisses in die Zwischenablage. #pyperclip muss aus dem Python Package Index #installiert werden; z.B. mithilfe von pip import pyperclip string = str(x) pyperclip.copy(string)
Aufruf via TUSCRIPT und Einlesen des Ergebnisses:
pythex_cb.m 8 KB]
$$ MODE TUSCRIPT, {} - ### Vorverarbeitung ### - ================================ - Python-Skript zur Berechnung des dekadischen Logarithmus - ausführen. Als Argument wird exemplarisch - der zu berechnende Bruch "10/3" übergeben. - ================================ python = "log10_cb.py" ERROR/STOP OPEN (python, READ, -STD-) pfad = FULL_NAME (TUSTEP, "log10_cb.py") EXECUTE "{pfad} 10/3" - ================================ - nach Ausführung des Skriptes wird das Ergebnis aus - der Zwischenablage eingelesen - ================================ - Ergebnis aus der Zwischenablage einlesen FETCH/CLIPBOARD log_ergcb - ggf. Daten in einen Datensatz zusammenfügen log_ergcb = JOIN (log_ergcb) - Kontrollausgabe ins Ablaufprotokoll PRINT "Das Ergebnis (aus der Zwischenablage) lautet: ", log_ergcb
Ausführung:
#MA,pythex_cb.m
- ms.tru
Anwendungsfall: In einem TUSCRIPT sollen Dateien (im Bsp. ausschließlich die in einem bestimmten Ordner liegenden XML-Dateien) mithilfe der Windows Powershell in ein anderes Verzeichnis kopiert werden:
$$ MODE TUSCRIPT, {} EXECUTE "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe" "get-childitem -path 'D:\Users\....\' -filter *.xml | copy-item -destination 'D:\Users\....\'"