Seite 1 von 1

Windows Systemvariablen in Pfade auflösen...

Verfasst: Mittwoch 24. November 2004, 23:06
von jens
Zu meiner kleinen Funktion hier:
http://python.sandtner.org/viewtopic.php?p=12528#12528

währe es doch schön, wenn in Pfadangaben automatisch Pfad-Platzhalter aufgelöst werden würden.

Bsp.:
"%SystemRoot%\\System32\\"

Gibt es dafür das fertiges in pure Python?

Ich denk frag mal, bevor ich selber anfange zu basteln ;) Mit os.environ kommt man ja an alles dran, müßte man nur noch ersetzten...

Verfasst: Mittwoch 24. November 2004, 23:43
von Dookie
Hi jens,

versuch mal
print os.path.expandvars("%SystemRoot%\\System32\\")
eventuell musst du vorher das
%name% in ein ${name} wandeln,
das geht mit
re.sub('%(?P<name>\w+)%', '${\g<name>}', "%SystemRoot%\\System32\\")


Gruß

Dookie

Verfasst: Donnerstag 25. November 2004, 15:07
von jens
Klappt nur nach der Umwandlung... Aber immerhin muß ich nicht's komplett selber basteln!

Danke!

Verfasst: Donnerstag 25. November 2004, 15:25
von Sorgenkind
bei mir klappts nicht dookie

würde das so machen:

Code: Alles auswählen

import os,re
def _replsysvars(a):
    var=a.group("var").upper() #upper wichtig, in os.environ sind alle keys groß geschrieben
    return os.environ[var] #hier könnte man noch ein verhalten machen wenns die systemvariable nicht gibt

def replacesysvars(s):
    return re.sub("%(?P<var>\w+)%", _replsysvars, s)
alternativ als einzeiler:

Code: Alles auswählen

re.sub("%(?P<var>\w+)%", lambda r: os.environ[r.group("var").upper()], "%SystemRoot%\\System32\\")

Verfasst: Donnerstag 25. November 2004, 15:31
von jens
Sorgenkind hat geschrieben:bei mir klappts nicht dookie
Verstehe ich nicht...

Code: Alles auswählen

print os.path.expandvars( re.sub('%(?P<name>\w+)%', '${\g<name>}', "%SystemRoot%\\System32") )
Was spuckt denn das aus?

Verfasst: Donnerstag 25. November 2004, 15:58
von Sorgenkind

Code: Alles auswählen

>>> print os.path.expandvars( re.sub('%(?P<name>\w+)%', '${\g<name>}', "%SystemRoot%\\System32\\") )
D:\WINDOWS\System32\
oh hab ich wohl was falsch kopiert ^^

Verfasst: Donnerstag 25. November 2004, 16:11
von Dookie
sorry, aber bei zu windowsspezifischen Problemen muss ich passen :)

Dookie

Verfasst: Mittwoch 11. Oktober 2006, 11:39
von HarryH
Hi,

Habe die obigen Infos mal zu einer Funktion zusammengeschlossen und noch etwas verbessert.
Falls z.B. eine Pfadname zwei Prozentzeichen enthält, diese Kombination aber keine Variable darstellt, werden diese nun bei meiner Funktion richtigerweise ignoriert. Dadurch wird vermieden, das sie durch "os.path.expandvars" falsch ausgewertet werden.

Hier die Funktion:

Code: Alles auswählen

def ExpandOsVars(name):
    """
    Return the argument with environment variables (os.environ) expanded.
    Substrings of the form "%var%", "$var" or "${var}" are replaced by the
    value of environment variable name.
    """
    def testvar(matchobj):
        if matchobj.group(1) in os.environ:
            return "$" + matchobj.group(1)
        else:
            return matchobj.group(0)
    return os.path.expandvars(re.sub('%(?P<name>\w+)%', testvar, name))