[Tustep-Liste] Batch-Modus

Giorgio Giacomazzi giorgio at giacomazzi.de
Di Dez 7 13:43:32 CET 2004


Liebe TUSTEP-Nutzer,

im Anschluß an die ITUG-Tagung vor einem Monat hat sich ein fruchtbarer 
Dialog zum "Batch-Modus" von TUSTEP ergeben. Herr Schälkle stellte mir 
ein Beispiel zur Verfügung, das die Minimalforderung eines 
NUMMERIERE-Aufrufs von der Kommandozeile realisiert, wobei Quell-, 
Ziel-, Parameterdatei und auch das Ablaufprotokoll als reine Textdateien 
vorliegen bzw. resultieren. Alle Dateien können so mit einem Editor der 
Wahl bearbeitet werden. Eine Ausnahme ist (war) die Datei TUSTEP.INI.

Im Einverständnis mit Herrn Schälkle möchte ich das Beispiel hier 
dokumentieren, zumal die Technik wenig bekannt ist und weil das Beispiel 
einen wichtigen Beitrag zur Schnittstellendiskussion darstellt. Mein 
aktuelles Ziel ist auszuloten, wie weit man sinnvollerweise mit dem 
Batch-Modus in TUSTEP gehen kann. Erfahrungswerte und 
Optimierungsvorschläge anderer Nutzer würden zur Klärung beitragen.

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


Was ist der "Batch-Modus"?
==========================

Der Batch-Modus meint die Ausführung von TUSTEP ohne 
TUSTEP-Bildschirm/-Fenster. Er ist gegenüber dem zumeist verwendeten 
Dialog-Modus dort von Vorteil, wo es nur auf die Programmausführung 
ankommt, der TUSTEP-Bildschirm gleichsam "stört". Die Abschaltung der 
Bildschirmaktualisierung hat generell auch Geschwindigkeitsvorteile. In 
der Praxis scheint der Batch-Modus aber nur bei CGI-Makros zum Einsatz 
zu kommen, vielleicht auch unbemerkt dank automatischer Einrichtung.

Uns interessiert hier die durch den Batch-Modus prinzipiell ermöglichte 
Eingliederung bestimmter TUSTEP-Funktionen in externe workflows. 
Darüberhinaus könnte der Batch-Modus vielleicht auch dazu dienen, die 
Kernfunktionalität von TUSTEP mit einer neuen Benutzeroberfläche zu 
versehen. Diese Möglichkeiten sind aber nicht bzw. nicht ausreichend 
dokumentiert.


Aufruf eines TUSTEP-Programms im Batch-Modus
============================================

Das Prinzip für den Aufruf von TUSTEP-Programmen außerhalb von TUSTEP ist:

1. Definieren von Umgebungsvariablen.

2. Vorbereiten einer TUSTEP.INI, die diese Umgebungsvariablen versteht.

3. Aufrufen von TUSTEP mit dieser TUSTEP.INI.


1. Definieren von Umgebungsvariablen
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Das Definieren von Umgebungsvariablen kann auf vielerlei Art und Weise 
geschehen: auf der Kommandozeile des Betriebssystems, mittels einer 
BAT-Datei, eines Shell-Skriptes, usw.. Der allgemeinen Verfügbarkeit 
halber wird hier eine unter Windows einsetzbare Batch-Datei verwendet:

------------------------------------------------
@ECHO OFF
REM Datei NUMMERIERE.BAT
REM Aufruf: NUMMERIERE quelle ziel parameter
REM Dateinamen im Aufruf mit kompletter Pfadangabe

REM Pfade zu TUSTEP-Directory (LIB), zu TUSTEP.INI (DSK), Scratch-Dateien
SET TUSTEP_LIB=C:/PROGRAMME
SET TUSTEP_DSK=C:
SET TUSTEP_SCR=C:/TMP
SET TUSTEP_PRJ=-

REM TUSTEP im Batch-Modus starten
SET TUSTEP_MDS=BATCH

REM Spezifische Parameter
SET PROGRAMM=NUMMERIERE
SET QUELLE=%1
SET ZIEL=%2
SET PARAMETER=%3

REM Starten von TUSTEP; Protokoll wird in Datei umgeleitet
%TUSTEP_LIB%/TUSTEP/O > nummeriere.log
------------------------------------------------

Die Umgebungsvariable PROGRAMM und ihre mögliche Werte müssen der 
TUSTEP.INI im Voraus bekannt sein. Dem Wert der Variable PROGRAMM muß 
ein gleichnamiges Segment in der TUSTEP.INI entsprechen. TUSTEP_PRJ kann 
nach meiner Erfahrung dagegen entfallen.


2. TUSTEP.INI
~~~~~~~~~~~~~

Folgende TUSTEP.INI enthält im Wesentlichen ein Segment für den Aufruf 
des TUSTEP-Programms NUMMERIERE.

------------------------------------------------
#=  INIT
#=  CONT
#=  NUMMERIERE
#=  VERGLEICHE
#=: INIT
#definiere,code=iso
$$ FETCH programm = programm
$$ INCLUDE <programm>
#=: CONT
#normiere
#=: NUMMERIERE
$$ FETCH quelle = quelle
$$ FETCH ziel = ziel
$$ FETCH parameter = parameter
#fehlerhalt,loesche
#de, dateinamen = *
quelle    = <quelle>
ziel      = <ziel>
parameter = <parameter>
*eof
#an, quelle'parameter, tr=-
#da, ziel, sdf-ap, tr=-
#da, scr*quelle'scr*ziel'scr*parameter
#um, quelle, scr*quelle, 0, +, code=iso
#um, parameter, scr*parameter, 0, +, code=iso
#nummeriere, scr*quelle, scr*ziel, -std-, +, scr*parameter
#um, scr*ziel, ziel, , +, cod=iso
#=: VERGLEICHE
Hier könnten entsprechende Anweisungen
und Kommandos für VERGLEICHE stehen
------------------------------------------------

Bekanntlich führt TUSTEP ein Segment INIT in der Datei TUSTEP.INI beim 
Start automatisch aus. Nach Auswertung der Umgebungsvariable PROGRAMM 
wird via INCLUDE ein entsprechendes Segment ausgeführt. Dieses Segment 
wertet zuerst spezifische Umgebunsvariablen (Dateipfade), wandelt die 
Quell- und Parameterdatei vom Text- ins TUSTEP-Format um, etc. Die 
Hauptsache ist aber der generische Aufruf des Programms, hier 
NUMMERIERE, welcher mit den konkreten Werten aus den Umgebungsvariablen 
konkretisiert wird. Die Zieldatei wird zum Schluß als Textdatei exportiert.


3. Aufruf von TUSTEP im Batch-Modus
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Auf der Grundlage der obigen BAT-Datei und TUSTEP.INI könnte ein 
NUMMERIERE-Aufruf im Batch-Modus, das aus einer QUELLE.TXT eine ZIEL.TXT 
gemäß PARAMETER.TXT liefert, wie folgt aussehen:

------------------------------------------------
C:\>  NUMMERIERE.BAT  C:\QUELLE.TXT  C:\ZIEL.TXT  C:\PARAMETER.TEXT
------------------------------------------------

Leider verlangt TUSTEP komplette Pfadangaben, auch wenn die Dateien sich 
im aktuellen Verzeichnis befinden, weshalb hier das untypsiche 
Wurzelverzeichnis gewählt wurde.

Die zufälligen Beispieldaten lehnen sich an das NUMMERIERE-Beispiel im 
Handbuch an:

QUELLE.TXT
------------------------------------------------
... @i *4 ...
... @i #2 ...
... @i #4 ...
... @i *2 ...
------------------------------------------------

ZIEL.TXT
------------------------------------------------
... @i *2 ...
... @i #1 ...
... @i #2 ...
... @i *1 ...
------------------------------------------------

PARAMETER.TXT
------------------------------------------------
LNR       /@i #/
VNR       /@i */
------------------------------------------------


Bemerkungen, Erweiterungen, Wünsche
===================================

- Der Aufruf ist generisch: Er kann auf beliebige Quell- und 
Parameterdateien angewendet werden.

- Durch die Umleitung der Standardausgabe in eine Datei (s. am Schluß 
der BAT-Datei) bleibt das Ablaufprotokoll von TUSTEP in voller Länge 
erhalten. Dies lernt man während der Testphase sehr schätzen, fast lieben.

- Da TUSTEP nur Dateien im eigenen Format direkt verarbeitet, müssen 
Quell-, Ziel-, und Parameterdateien in jedem Programm-Segment 
NUMMERIERE, VERGLEICHE, usw. neu importiert und exportiert werden. Dies 
ermöglicht aber die Kombinationen von Kommandos zu einer Kommandofolge.

- Werden Umgebungsvariablen falsch gesetzt, könne die Folgen auch 
unangenehme sein: TUSTEP versucht wiederholt im Dialog-Modus zu starten; 
die Protokolldatei wächst ständig weiter; zurückgebliebene 
Scratch-Dateien verhindern einen korrekten Neustart trotz korrekter 
Variablen.

- Besonders fehlerträchtig sind die unter DOS/Windows noch üblichen 
BAT-Dateien. Um Fehlern vorzubeugen, würde ich gerade bei BAT-Dateien 
mehrere Sicherheitsmaßen empfehlen:

   1. Umgebungsvariablen zuerst annullieren, z.B. "SET TUSTEP_LIB="

   2. Prüfen, daß Umgebungsvariablen erfolgreich definiert wurden:

	if (%TUSTEP_LIB%) == () goto EXIT_ERROR
	if not exist %TUSTEP_LIB% goto EXIT_ERROR

   3. Wert der Variablen zur Kontrolle ausgeben,
      generell oder nur im ERROR-Block:

	echo TUSTEP_PRJ = [%TUSTEP_PRJ%]

   4. Zurückgebliebene Scratch-Dateien vor dem Aufruf
      "%TUSTEP_LIB%/TUSTEP/O" löschen (radikal, aber effizient):

	del /q %TUSTEP_SCR%\*.TSF

- TUSTEP verlangt auf der Systemebene absolute Pfadangaben. Das ist 
lästig und fehlerträchtig, wenn eingegeben werden muß:

	NUMMERIERE.BAT "C:\Dokumente\username\batchtest\QUELLE.TXT" 
"C:\Dokumente\username\batchtest\ZIEL.TXT" 
"C:\Dokumente\username\batchtest\PARAMETER.TEXT"

Es wäre schön, wenn TUSTEP mit relativen Pfadangaben umgehen könnte, 
sodaß folgende Eingabe genügt, wenn die Dateien im Pfad liegen:

       NUMMERIERE.BAT QUELLE.TXT ZIEL.TXT PARAMETER.TEXT

Wenn ich richtig verstanden habe, soll aber die Makrosprache bald 
relative Pfadangaben unterstützen.

- Für eine Nutzung des Batch-Modus von TUSTEP im grösseren Stil sind 
BAT-Dateien m.E. nicht empfehlenswert, eher Shell-Skripts oder eine 
ordentliche Skriptsprache. Folgendes Python-Beispiel zeigt nicht bloß 
den Aufruf eines einzigen NUMMERIERE, sondern den Aufruf mehrerer 
TUSTEP-Programme hintereinader, wobei bekannte Fehler automatisch 
abgefangen werden:

     from tustep import *

     t = TustepBatch()

     t.setPathToTustepDir("C:/Programme")
     t.setPathToTustepIni("C:/test")
     t.setPathToTustepScr("C:/test/tmp")

     t.nummeriere("quelle.txt", "ziel.txt", "param.txt" )
     t.setEnvironmentVar("MODUS", "WORT")
     t.vergleiche("quelle.txt", "ziel.txt", "ve_prot.txt")
     ...

Da die TUSTEP-Pfade i.d.R. aber gleich bleiben, können die drei Zeilen 
setPathToTustepXXX() nach erstmaliger Definition entfallen, die 
Definition übernommen werden. Dann genügt im Prinzip:

     from tustep import *
     t = TustepBatch()
     t.nummeriere("quelle.txt", "ziel.txt", "param.txt" )
     t.vergleiche("quelle.txt", "ziel.txt", "ve_prot.txt")

Im Hintergrund passiert einiges:
- zurückgebliebene Scratch-Dateien werden gelöscht (bei "t = 
TustepBatch()");
- relative Dateipfade, z.B. "quelle.txt", werden automatisch in absolute 
Pfade umgewandelt und als solche an TUSTEP übergeben;
- der TUSTEP-Start wird unterbunden, wenn die Pfade nicht zutreffen oder 
wenn Umgebungsvariablen nicht definiert wurden.

Zur Anpassung des Grundsystems können zusätzliche Umgebungsvariablen 
zugewiesen werden, soweit sie auch der TUSTEP.INI bekannt sind. 
Beispielsweise wird oben vor dem Aufruf von VERGLEICHE noch eine 
Umgebungsvariable MODUS mit als "WORT" definiert.

- Zur Optimierung umfangreicher, komplexer Prozeduren würde ich mir 
wünschen, daß im Ablaufprotokoll beim Ende eines Einzelprogramms, z.B. bei
   "Ende  UMWANDLE   auf: GIORGIO   am: 07.11.04  um: 12:37:02"
auch die Programmdauer in Sekundenbruchteilen erscheint.

- Die Datei TUSTEP.INI ist die einzige der beteiligten Dateien, die mit 
TUSTEP erstellt werden muß. Dies ist nicht nur ein Konzeptbruch, sondern 
in der Testphase ziemlich unhandlich. Nun ist es mir gelungen, eine 
korrekte TUSTEP.INI zu generieren (ohne TUSTEP). Damit entfällt auch der 
lästige Wechsel zwischen dem TUSTEP- und dem Texteditor. TUSTEP wird 
mehr und mehr zu einem "Dienst".

...

+++++++++++++++++++++++++++++++++++++++++++++++++++

Damit ein anderes Thema der ITUG-Tagung, die Veröffentlichung des 
Handbuchs im Internet, vielleicht auch ein TUSTEP-Wiki, nicht in 
Vergessenheit gerät, überlege ich die Dokumentation zum Batch-Modus auch 
als wiki-Seite zur Verfügung zu stellen. Benachrichtigung folgt.

Nun möchte ich aber Herrn Schälkle für den wertvollen Beitrag zu einer 
zentralen Quo vadis-Frage danken. Ich hoffe auf eine Fortsetzung.

Mit besten Grüßen,

Giorgio Giacomazzi

Strelitzstr. 18
D-12105 Berlin
Tel.: 030-70176848


Mehr Informationen über die Mailingliste Tustep-Liste