【发布时间】:2019-05-31 17:48:56
【问题描述】:
尝试使用shutil.which() 来确定是否安装了git。从文档中,我看到 Windows 上的 which() 应该使用 PATHEXT 来知道在搜索时要附加哪些文件扩展名。但是在使用解释器时会出现以下情况:
>>> import os
>>> import shutil
>>> os.getenv('PATHEXT')
'.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;'
>>> shutil.which('git')
>>> shutil.which('git.exe')
'C:\\Program Files\\Git\\cmd\\git.exe'
这是在使用 D:\Envs 中的 VirtualEnv Wrapper 创建的虚拟环境中,如果这有什么不同的话。
【问题讨论】:
-
尝试将
PATHEXT改为小写,例如os.environ['PATHEXT'] = os.environ['PATHEXT'].lower()。如果这样可行,显然该目录被标记为区分大小写,这在 Windows 10 中使用 NTFS 是可能的。 -
shutil 自己处理路径扩展。我只是将它包含在此处以显示返回的内容(并且确实存在 .exe)。见the docs
-
shutil.which('git')将在PATH中查找“git.EXE”。如果目录区分大小写,则“git.EXE”将与目录中名为“git.exe”的文件不匹配。我不知道这是否是您的问题,但是自从 NTFS 开始支持区分大小写的目录以来,我遇到了PATHEXT的问题,所以这是第一个想到的解决方法,也是目前唯一可以解决的问题考虑到shutil.which的实现,对我来说很有意义。