【问题标题】:shutil.which() not finding programs without appending file extensionshutil.which() 在不附加文件扩展名的情况下找不到程序
【发布时间】: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 的实现,对我来说很有意义。

标签: python windows shutil


【解决方案1】:

PATHEXT 环境变量中删除尾随;shutil.which() 似乎对此感到困惑,并将空字符串解释为有效的文件扩展名,因此不会尝试附加任何文件扩展名。

更多详情:"jupyter-kernelspec" not found while installing iqsharp however it exists on PATH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 2021-09-06
    • 2011-09-23
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多