Python中的“哪个”等效函数

时间:2011-03-08 00:23:32

标签: python command which

我需要通过运行which abc命令来设置环境。 是否有 which 命令的Python等效函数? 这是我的代码。

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

8 个答案:

答案 0 :(得分:82)

答案 1 :(得分:46)

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

一个例子就是这样:

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

答案 2 :(得分:13)

没有命令可以执行此操作,但您可以迭代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
祝你好运!

答案 3 :(得分:12)

Similar question

参见Twisted实现:twisted.python.procutils.which

答案 4 :(得分:4)

您可以尝试以下内容:

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

答案 5 :(得分:2)

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

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

答案 6 :(得分:2)

这相当于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

答案 7 :(得分:0)

以下是早期答案的单行版本:

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'