Windows Systemvariablen in Pfade auflösen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 24. November 2004, 23:06

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...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Mittwoch 24. November 2004, 23:43

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
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 25. November 2004, 15:07

Klappt nur nach der Umwandlung... Aber immerhin muß ich nicht's komplett selber basteln!

Danke!
Sorgenkind
User
Beiträge: 34
Registriert: Samstag 24. Juli 2004, 19:25
Kontaktdaten:

Donnerstag 25. November 2004, 15:25

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\\")
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 25. November 2004, 15:31

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?
Sorgenkind
User
Beiträge: 34
Registriert: Samstag 24. Juli 2004, 19:25
Kontaktdaten:

Donnerstag 25. November 2004, 15:58

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 ^^
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Donnerstag 25. November 2004, 16:11

sorry, aber bei zu windowsspezifischen Problemen muss ich passen :)

Dookie
[code]#!/usr/bin/env python
import this[/code]
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Mittwoch 11. Oktober 2006, 11:39

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))
Gruß, Harry
Antworten