在Python中,是否有一种可移植且简单的方法来测试可执行程序是否存在?

我说的简单是指像which命令这样完美的命令。我不想手动搜索PATH或涉及尝试与Popen & al执行它,看看它是否失败(这就是我现在做的,但想象它是launchmissiles)


当前回答

*nix平台(Linux和OS X)

这似乎对我很管用:

编辑工作在Linux上,感谢Mestreion

def cmd_exists(cmd):
    return subprocess.call("type " + cmd, shell=True, 
        stdout=subprocess.PIPE, stderr=subprocess.PIPE) == 0

我们在这里所做的是使用内置命令类型并检查退出代码。如果没有这样的命令,type将以1退出(或者一个非零的状态码)。

关于stdout和stderr的部分只是为了屏蔽type命令的输出,因为我们只对退出状态代码感兴趣。

使用示例:

>>> cmd_exists("jsmin")
True
>>> cmd_exists("cssmin")
False
>>> cmd_exists("ls")
True
>>> cmd_exists("dir")
False
>>> cmd_exists("node")
True
>>> cmd_exists("steam")
False

其他回答

您可以尝试名为“sh”(http://amoffat.github.io/sh/)的外部库。

import sh
print sh.which('ls')  # prints '/bin/ls' depending on your setup
print sh.which('xxx') # prints None

这看起来很简单,在python2和python3中都可以使用

try: subprocess.check_output('which executable',shell=True)
except: sys.exit('ERROR: executable not found')

只要记住在windows上指定文件扩展名即可。否则,你必须使用PATHEXT环境变量为windows编写一个非常复杂的is_exe。您可能只想使用FindPath。

哦,你为什么还要费心搜索可执行文件呢?操作系统将作为popen调用的一部分为你做这件事,如果找不到可执行文件,将引发一个异常。您所需要做的就是为给定的操作系统捕获正确的异常。注意,在Windows上,subprocess。如果没有找到exe, Popen(exe, shell=True)将会静默失败。


将PATHEXT合并到上面的实现中(在Jay的回答中):

def which(program):
    def is_exe(fpath):
        return os.path.exists(fpath) and os.access(fpath, os.X_OK) and os.path.isfile(fpath)

    def ext_candidates(fpath):
        yield fpath
        for ext in os.environ.get("PATHEXT", "").split(os.pathsep):
            yield fpath + ext

    fpath, fname = os.path.split(program)
    if fpath:
        if is_exe(program):
            return program
    else:
        for path in os.environ["PATH"].split(os.pathsep):
            exe_file = os.path.join(path, program)
            for candidate in ext_candidates(exe_file):
                if is_exe(candidate):
                    return candidate

    return None

使用Python标准库中的shutil.which()。 电池包括!

在标准的Python发行版中有一个which.py脚本(例如在Windows的` \PythonXX\Tools\Scripts\which.py `)。

EDIT: which.py依赖于ls,因此它不是跨平台的。