2017-07-25 1 views
1

Existe-t-il une bibliothèque Python qui prend un chemin d'accès Windows et remplace les variables d'environnement étendues par des variables d'environnement?Conversion d'un chemin d'accès Windows en chemin à l'aide de variables d'environnement

Par exemple:

C:\Users\Username\Documents\Text.txt -> %USERPROFILE%\Documents\Text.txt 
C:\Windows\System32\cmd.exe -> %WINDIR%\System32\cmd.exe 
C:\Program Files\Program\Program.exe -> %PROGRAMFILES%\Program\Program.exe 

La meilleure façon d'expliquer serait d'obtenir une fonctionnalité qui fait le contraire de

os.path.expandvars('some path with environment variables') 

Soutien aux langues serait également une exigence.

C:\Archivos de programa\Progra\Program.exe -> %PROGRAMFILES%\Program\Program.exe 
+2

Je ne pense pas que cela soit possible, ou du moins il est ambigu. Il n'y a rien à dire qu'il y a un mappage un-à-un des répertoires aux variables d'environnement. En d'autres termes, je pourrais avoir à la fois '% FOO%' et '% BAR%' qui se développent en 'C: \ Windows', dans ce cas, que dois-je utiliser? – CoryKramer

+0

Il existe un module ['winshell'] (https://winshell.readthedocs.io/), plus précisément ses [Dossiers spéciaux] (https://winshell.readthedocs.io/en/latest/special-folders.html) partie qui attrape certains des dossiers spéciaux. Pour le reste, vous devrez utiliser l'API Win32. Ensuite, il suffit de vérifier si votre chemin croise le dossier spécial et de le remplacer par son nom canonique _environment variable_name - vous pouvez utiliser les fonctions 'os.path' pour cela. – zwer

+0

@CoryKramer il suffit de mapper les variables d'environnement Windows par défaut connues, pas les nouvelles. –

Répondre

1

Ceci est un problème non négligeable depuis plus de variables d'environnement peuvent correspondre à des parties de votre chaîne (ex: PROCESSOR_LEVEL est généralement un seul chiffre, de sorte que vous devriez éviter). Afin d'assurer la meilleure efficacité, je le ferais:

  • sorte la variable d'environnement existant l

comme ceci:

import os 

my_string = os.path.normpath(r"D:\Users\JOTD\AppData\Roaming\Adobe\Flash Player") 


for k,v in sorted(os.environ.items(),key=lambda x:len(x[1]),reverse=True): 
    my_new_string = my_string.replace(v+os.sep,"%{}%{}".format(k,os.sep)) 
    if my_string != my_new_string: 
     break 
    my_string = my_new_string 

print(my_new_string)