【问题标题】:How can I find the path for an executable?如何找到可执行文件的路径?
【发布时间】:2011-07-10 18:18:14
【问题描述】:

我需要使用二进制文件的路径设置环境。在 shell 中,我可以使用which 来查找路径。 python中是否有等价物? 这是我的代码。

cmd = ["which","abc"]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
res = p.stdout.readlines()
if len(res) == 0: return False
return True

【问题讨论】:

标签: python


【解决方案1】:

【讨论】:

  • +1,这很酷,而且是标准库的一部分!请注意,它在 Windows 上非常有限 - 它不解析 PATHEXT,而是假定它应该搜索“.exe”扩展名(缺少批处理文件等)
  • 注意它不会检查文件是否可执行。
  • 这在 2.7 或 3.6 上对我不起作用。它给出了一个错误,即未找到 spawn 模块。
  • @GreenMatt,刚刚在 3.7 上试用过,效果很好。正如其他人所说,不要忘记先运行import distutils.spawn
【解决方案2】:

我知道这是一个较老的问题,但如果您碰巧使用的是 Python 3.3+,则可以使用shutil.which(cmd)。您可以找到文档here。它具有在标准库中的优势。

一个例子是这样的:

>>> import shutil
>>> shutil.which("bash")
'/usr/bin/bash'

【讨论】:

    【解决方案3】:

    没有执行此操作的命令,但您可以遍历 environ["PATH"] 并查看文件是否存在,这实际上是 which 所做的。

    import os
    
    def which(file):
        for path in os.environ["PATH"].split(os.pathsep):
            if os.path.exists(os.path.join(path, file)):
                    return os.path.join(path, file)
    
        return None
    

    祝你好运!

    【讨论】:

    • 您要谨慎地对 pathep 字符进行假设。
    • 和路径分隔符,但这只是为了说明问题。祝你好运!
    • 使用os.path.sep 代替/os.pathsep 代替:
    • 不要使用'+',使用os.path.join。查看更多关于 stdlib 实现 (distutils) 和更独立于 Twisted 项目的平台的答案。
    • 感谢 os.path.join。扭曲的实现是完全隔离的,似乎与项目的其余部分没有任何相互依赖关系,因此作为一个实现它要好得多(至少比我的)
    【解决方案4】:

    【讨论】:

    【解决方案5】:

    您可以尝试以下方法:

    import os
    import os.path
    def which(filename):
        """docstring for which"""
        locations = os.environ.get("PATH").split(os.pathsep)
        candidates = []
        for location in locations:
            candidate = os.path.join(location, filename)
            if os.path.isfile(candidate):
                candidates.append(candidate)
        return candidates
    

    【讨论】:

    • 您还需要考虑PATHEXT
    • 在 Windows 机器上,我怀疑您可能会查找文件的确切名称,而不是假设扩展名。话虽如此,添加一个遍历 PATHEXT 成员的内部循环并不难。
    【解决方案6】:

    如果你使用shell=True,那么你的命令将通过系统shell运行,它会自动找到路径上的二进制文件:

    p = subprocess.Popen("abc", stdout=subprocess.PIPE, shell=True)
    

    【讨论】:

    • 即使没有shell=True,它也会在路径中查找,但如果您想查找存在哪些可能的命令,它也无济于事。
    【解决方案7】:

    这相当于which命令,不仅检查文件是否存在,还检查是否可执行:

    import os
    
    def which(file_name):
        for path in os.environ["PATH"].split(os.pathsep):
            full_path = os.path.join(path, file_name)
            if os.path.exists(full_path) and os.access(full_path, os.X_OK):
                return full_path
        return None
    

    【讨论】:

      【解决方案8】:

      这是早期答案的单行版本:

      import os
      which = lambda y: next(filter(lambda x: os.path.isfile(x) and os.access(x,os.X_OK),[x+os.path.sep+y for x in os.getenv("PATH").split(os.pathsep)]),None)
      

      这样使用:

      >>> which("ls")
      '/bin/ls'
      

      【讨论】:

      • 这似乎在 Python2 中不起作用,TypeError: list object is not an iterator
      猜你喜欢
      • 2012-08-18
      • 2010-10-14
      • 1970-01-01
      • 2021-08-28
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 2013-06-09
      相关资源
      最近更新 更多