2017-07-25 188 views
1

是否有一个Python库需要一个Windows路径并用环境变量替换扩展的环境变量?使用环境变量将Windows路径转换为路径

例如:

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 

解释将获得的功能,确实

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

支持不同语言的对面也将是一个需求的最佳途径。

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

我不认为这是可能的,或者至少是暧昧。没有什么可以说目录与环境变量是一对一的映射。换句话说,我可以将'%FOO%'和'%BAR%'都扩展为'C:\ Windows',在这种情况下,我应该使用哪种? – CoryKramer

+0

有一个['winshell'](https://winshell.readthedocs.io/)模块,特别是它的[Special Folders](https://winshell.readthedocs.io/en/latest/special-folders.html)抓住一些特殊文件夹的部分。其余的你必须使用Win32 API。然后,它只是检查你的路径是否与特殊文件夹相交,并用规范的_environment variable_ name替换 - 你可以使用'os.path'设备。 – zwer

+0

@CoryKramer它只需要映射到已知的默认Windows环境变量,而不是任何新的。 –

回答

1

这是一个不平凡的问题,因为超过环境变量可以匹配你的部分字符串(例如:PROCESSOR_LEVEL通常是一个单一的数字,所以你应该避免)。为了确保最佳的效率,我想:

  • 排序现有的环境变量l

这样的:

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)