Seite 1 von 1

Dateien aus Template und Variablen generieren

Verfasst: Mittwoch 7. April 2010, 20:59
von timetrinus
Hallo Leute,

ich stehe ein wenig auf dem Schlauch. Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen. Der Aufbau einer Zeile innerhalb des Templates ist in etwa so:

nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@


Im Ziel müsste die Zeile dann so aussehen:

nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99 ARGS=soft,nosync configspace-p-20100403-002


Die Konfigurationsdatei sieht da wie folgt aus:
[stage-p]
nfsroot=nfsroot-p-20100407-001
config=configspace-p-20100403-002

[stage-t]
nfsroot=nfsroot-p-20100406-001
config=configspace-p-20100403-002

Ich denke, dass das irgendwie mit re gemacht werden kann / muss. Nur leider stehe ich vollkommen auf dem Schlauch. Kann wer helfen?

Re: Dateien aus Template und Variablen generieren

Verfasst: Mittwoch 7. April 2010, 21:21
von problembär
timetrinus hat geschrieben:Ich muss aus mehreren Templatedateien und einer Konfigurationsdatei unterschiedliche Zieldateien erzeugen.
Na und, ich nicht.
nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@
Sagt mir gar nichts.
Kann wer helfen?
Könnte schon, hab' aber keine Lust.

Verfasst: Mittwoch 7. April 2010, 21:30
von jbs
@problembär: Schlecht drauf?

Verfasst: Mittwoch 7. April 2010, 22:38
von BlackJack
@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.

Oder wo war jetzt die konkrete Frage?

Verfasst: Mittwoch 7. April 2010, 22:58
von ms4py
BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.
Statt `ConfigParser`lieber `configobj` ( http://www.voidspace.org.uk/python/configobj.html )

Verfasst: Donnerstag 8. April 2010, 08:24
von timetrinus
BlackJack hat geschrieben:@timetrinus: Das `re`-Modul und das `ConfigParser`-Modul solltest Du Dir mal anschauen.

Oder wo war jetzt die konkrete Frage?
Ja, das `re`-Modul hatte ich schon befürchtet. Mit re.findall finde ich ja auch die betreffenden Zeilen. Aber ich müsste das ja wie folgt machen:

1. suche nach @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@
2. Zerlege den gefundenen Teilstring: stage=value1, var=value2
3. Ermittle für stage den Wert von var aus der Konfig
4. ersetze das gesamte Konstrukt @@[0-9a-zA-Z-]*@[0-9a-zA-Z-]*@@ durch den ermittelten Wert für var

Soweit die therorie. Ich bekomme es aber in der Praxis nicht hin und bin für Hilfe dankbar.

Verfasst: Donnerstag 8. April 2010, 09:06
von philistion
Reichen re.findall, re.split, re.sub und die restlichen Hinweise in der re-Hilfe nicht aus?

Poste mal deinen aktuellen Code, dann kann man korrigieren wenn du was falsch gemacht hast.

Verfasst: Donnerstag 8. April 2010, 09:25
von sma
Na, dann habe ich mal erbamen. Du willst REs, du bekommst REs:

Code: Alles auswählen

import re

s = """
[stage-p] 
nfsroot=nfsroot-p-20100407-001 
config=configspace-p-20100403-002 

[stage-t] 
nfsroot=nfsroot-p-20100406-001 
config=configspace-p-20100403-002
"""

conf = {}

for line in s.splitlines():
    m = re.match(r'^\[(.*?)\]\s*$', line)
    if m: section = m.group(1); conf[section] = {}; continue
    m = re.match(r'^(.*?)\s*=\s*(.*?)\s*$', line)
    if m: conf[section][m.group(1)] = m.group(2)

s = "nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ " +\
    "serverip=10.221.1.99 ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@"

print(re.sub(
    r'@@STAGE:(.*?)@VAR:(.*?)@@', 
    lambda m:conf[m.group(1)][m.group(2)],
    s))
Stefan

Verfasst: Donnerstag 8. April 2010, 09:45
von BlackJack
Ich würde den Gruppen in dem RE noch Namen geben, dann wird's IMHO etwas lesbarer. Insbesondere wenn RE und Funktion mal nicht so dicht zusammen stehen.

Code: Alles auswählen

import re
from ConfigParser import ConfigParser


def main():
    template = ('nfsroot=@@STAGE:stage-p@VAR:nfsroot@@ serverip=10.221.1.99'
                ' ARGS=soft,nosync @@STAGE:stage-p@VAR:config@@')
    expected = ('nfsroot=nfsroot-p-20100407-001 serverip=10.221.1.99'
                ' ARGS=soft,nosync configspace-p-20100403-002')
    
    config = ConfigParser()
    config.read('test.cfg')
    
    result = re.sub(r'@@STAGE:(?P<stage>.*?)@VAR:(?P<var>.*?)@@',
                    lambda m: config.get(m.group('stage'), m.group('var')),
                    template)
    print result
    print result == expected


if __name__ == '__main__':
    main()

Verfasst: Donnerstag 8. April 2010, 09:55
von sma
Lesbar war nicht mein Ziel. Ich wollte alles mit REs machen... :)